[프로그래머스 17681 - 카카오 2018 1차] 비밀지도
문제출처
https://programmers.co.kr/learn/courses/30/lessons/17681
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제풀이
2장의 지도를 겹친 값을 얻기 위해 OR 연산을 사용했다. OR연산을 사용하면 문제에서 원하는 전체 지도를 얻을 수 있다. 이후 '#'(벽)과 ' '(공백)을 찾기 위해서는 비트연산을 사용했다. 예를 들어 전체지도의 값이 10진수로 19이라면 2진수로 10011로 나타낼 수 있다. 2진수로 나타낸 값과 1을 오른쪽으로 시프트 한 값(1<<j)의 AND 연산이 1이라면 벽을 추가하고 이외의 경우 공백을 추가하면 된다.
비트연산에 대해 이해가 되지 않는다면 아래글을 참조하자.
https://swjeong.tistory.com/114?category=781121
[Bitmask] 비트마스크 기초
Bitmask 컴퓨터는 이진번 관련 연산들을 매우 빠르게 진행할 수 있는데, 이러한 특성들을 사용하여 이진수 표현을 자료구조로 사용하는 기법을 비트마스크라고 합니다. 비트마스크는 자료구조라고는 할 수는 없지..
swjeong.tistory.com
10011 & 00001 = 1
10011 & 00010 = 1
10011 & 00100 = 0
10011 & 01000 = 0
10011 & 10000 = 1
즉 answer에는 '## #'의 값이 들어가게 되는데 이는 뒤에서부터 진행한 결과이므로 결과값을 뒤집어 answer 벡터에 추가해주면 된다.
소스코드
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
vector<string> solution(int n, vector<int> arr1, vector<int> arr2) {
vector<string> answer;
for (int i=0; i<n; i++) {
int sumValue = (arr1[i] | arr2[i]);
string ans = "";
for (int j=0; j<n; j++) {
if (sumValue & (1<<j)) ans+="#";
else ans+=" ";
}
reverse(ans.begin(), ans.end());
answer.push_back(ans);
}
return answer;
}