Algorithm/Programmers

2018 KAKAO BLIND RECRUITMENT - 비밀지도

K.Scrt.D 2020. 12. 23. 10:49

문제 링크 : programmers.co.kr/learn/courses/30/lessons/17681

 

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

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

programmers.co.kr

 

문제 풀이

두 정수 벡터에서 각각의 인덱스에 위치한 정수를 OR연산하고 이진수로 나타냈을 때 1로 표시되는 위치를 #으로 출력하고, 0으로 표시되는 위치를 공백으로 출력하는 문제이다.

즉, arr1[idx] | arr2[idx] 의 값을 이진수로 생각하고 각 비트가 위치한 자리를 구하기 위한 방법으로 비트 마스킹을 생각해볼 수 있다.

 

두 배열의 각각 i번째 원소를 이진수로 생각하고 j번째 위치가 0인지 아닌지를 판별하면 된다.

둘 중 어느 하나가 0이 아니라면 '#'을 추가하고, 그 이외의 경우(0인 경우)에는 ' ' 공백을 추가한다.

(0이 아니면 이진법으로 생각했을 때 해당 위치에 1이 있는 것이고, 0이면 0이 있는 것이다.)

 

이때 $2^0$을 의미하는 0번째 위치인 LSB(최하위 비트)가 제일 우측이므로 n - 1번째부터 0번째 위치를 판별해가면서 answer 배열에 문자를 추가하면 된다.

이 과정을 코드로 나타내면 아래와 같다.

 

소스 코드

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

vector<string> solution(int n, vector<int> arr1, vector<int> arr2) {
    vector<string> answer(n);
    for (int i = 0; i < n; ++i) {
        for (int j = n - 1; j >= 0; --j) {
            answer[i] += ((arr1[i] & (1 << j)) | (arr2[i] & (1 << j))) != 0 ? '#' : ' ';
        }
    }
    return answer;
}