기록공간

비밀지도 (프로그래머스) 본문

Algorithm/문제

비밀지도 (프로그래머스)

입코딩 2020. 5. 16. 20:00
반응형

이진수로 변환하는 방법만 안다면 어렵지 않게 풀 수 있는 문제이다.

 

이진수 변환에는 쉬프트 연산을 사용하였다. 예를 들어 9를 이진수로 변환한다고 하자. 9의 이진수는 1001이다. (전체 이진수 크기 - 1) 부터 시작한다.

9(1001) >> 3       -->       0001 (1번째 위치의 이진수 값은 1이다)
9(1001) >> 2      -->        0010 (2번째 위치의 이진수 값은 0이다)

다음과 같이, 쉬프트 연산(<<, >>)을 하면 맨 왼쪽 자리에 구하고자 하는 위치의 이진수의 값을 알 수 있게된다. 이 

작업을 쉬프트 연산을 0으로 할때까지 반복하면 전체 이진수 값을 구할 수 있게된다. 

 

여기서는 맵의 크기로 n이 주어지기 때문에 n크기에 맞는 이진수 값을 만들어야 한다. 그렇기 때문에 n - 1부터 0까지 반복하며 쉬프트 연산을 해주면 알맞은 이진수값을 만들 수 있다.

 

특정 위치의 이진수 값이 1인 경우에는 '#', 0인 경우에는 ' ' 공백이 와야 하므로 이진수 변환시 1, 0 대신 '#'과 ' '을 문자열로 넣어주면 된다.

 

코드는 다음과 같다.

#include <string>
#include <vector>
using namespace std;

vector<string> solution(int n, vector<int> arr1, vector<int> arr2) 
{
    vector<string> answer;
    // 입력된 지도 정보 수 만큼 반복한다.
    for(int i = 0; i < arr1.size(); ++i)
    {
        string tmpStr; // 답으로 입력될 문자열
        // 지도 크기 - 1 부터 0까지 반복하여 이진수를 찾는다.
        for(int j = n - 1; j >= 0; --j) 
        {
            // 쉬프트 연산을 사용하여
            // 첫번째 지도 정보의 이진수 값에 대한 알맞은 문자를 찾는다.
            char c =  arr1[i] >> j & 1 ? '#' : ' ';
            // 첫번째 지도 정보의 문자가 ' '이여도 
            // 두번째 지도 정보의 문자가 '#'이라면 문자는 '#'이 와야 한다.
            if(arr2[i] >> j & 1) c = '#';
           
            tmpStr += c; // 알맞은 문자를 문자열에 입력한다.
        }
        answer.push_back(tmpStr);
    }
    return answer;
}
반응형
Comments