프로그래머스/Level 1

[프로그래머스/C++] Level 1 [1차] 비밀지도(2018 KAKAO BLIND RECRUITMENT)

끄적이23 2020. 7. 27. 14:09

문제

https://programmers.co.kr/learn/courses/30/lessons/17681

 

코딩테스트 연습 - [1차] 비밀지도

비밀지도 네오는 평소 프로도가 비상금을 숨겨놓는 장소를 알려줄 비밀지도를 손에 넣었다. 그런데 이 비밀지도는 숫자로 암호화되어 있어 위치를 확인하기 위해서는 암호를 해독해야 한다. 다

programmers.co.kr

풀이

- arr1, arr2를 순서대로 각각 이진수로 바꿔줌

- 이진수니까 뒤집어서 정렬

- 각 벡터의 이진수를 비교해서 하나라도 1이면 '#', 둘 다 0이면 ' '

코드

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

vector<string> solution(int n, vector<int> arr1, vector<int> arr2) {
    vector<string> answer;
    string anan = "";
    vector<int> a1;
    vector<int> a2;
    
    for(int k=0;k<n;k++){
        for(int i=0;i<n;i++){
            if(arr1[k] % 2 == 1){
                a1.push_back(1);
            } else{
                a1.push_back(0);
            }
            arr1[k] /= 2;
        }
 
        reverse(a1.begin(), a1.end());
        
        for(int i=0;i<n;i++){
            if(arr2[k] % 2 == 1){
                a2.push_back(1);
            } else{
                a2.push_back(0);
            }
            arr2[k] /= 2;
        }
        
        reverse(a2.begin(), a2.end());
        
        for(int i=0;i<n;i++){
            if(a1[i] == 1 || a2[i] == 1){
                anan += '#';
            } else{
                anan += ' ';
            }
        }
        
        answer.push_back(anan);
        
        anan = "";
        a1.clear();
        a2.clear();
    }
        
    return answer;
}

시행착오

처음엔 한 번에 이진수로 바꾸고 저장한 벡터를 각각 만드려고 했음

하지만, 숫자 한 개씩 이진수로 바꾸고 바로 비교하는게 메모리적이나 속도적으로 좋았다고 생각함

 

이진수로 어떻게 바꾸는 코드를 짤 수 있는지 고민함..

첨엔 while문 써서 arr[k]가 0이 되면 종료시키고, n의 크기만큼 부족한 공간을 0으로 채워주는 식으로 코드 짰었는데 for문을 이용하면 0으로 된 이후로 나머지 공간은 0으로 채워짐 ..!!!!

 

그리고 이진수는 반대로 정렬해야하니까 reverse함수로 반대로 정렬해줌.