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;
}