-
[프로그래머스] 비밀지도카테고리 없음 2020. 9. 6. 19:20
풀이)
비트마스킹을 이해했다면 풀 수 있는 문제이다.
처음 풀이)
arr1의 원소와 arr2 원소 따로 따로 보면서 벽인 곳을 바꿔줬다.
#include <string> #include <vector> #include <iostream> using namespace std; vector<string> solution(int n, vector<int> arr1, vector<int> arr2) { vector<string> answer; string tmp =""; for(int i=0;i<n;i++){ tmp += ' '; } for(int i=0;i<n;i++){ answer.push_back(tmp); } for(int i=0;i<n;i++){ int a = arr1[i]; int idx = 0; while(a && idx < n){ if(a & 1 << idx){ answer[i][n-1-idx] = '#'; a -= 1 << idx; } idx++; } int b = arr2[i]; idx =0; while(b && idx < n){ if(b & 1 << idx){ answer[i][n-1-idx] = '#'; b -= 1 << idx; } idx++; } // cout << "answer = : " << answer[i] << endl; } return answer; }
간편해진 코드)
따로따로 하지않고, arr1과 arr2의 원소를 OR연산을 통해
미리 벽 위치에 해당하는 bit를 1로 바꿔둔다.
#include <string> #include <vector> #include <iostream> using namespace std; vector<string> solution(int n, vector<int> arr1, vector<int> arr2) { vector<string> answer; string tmp =""; for(int i=0;i<n;i++){ tmp += ' '; } for(int i=0;i<n;i++){ answer.push_back(tmp); } for(int i=0;i<n;i++){ int a = arr1[i] | arr2[i]; //OR연산자를 통해 미리 벽인 곳을 합쳐둔다. int idx = 0; while(a && idx < n){ if(a & 1 << idx){ answer[i][n-1-idx] = '#'; a -= 1 << idx; } idx++; } } return answer; }
미리 answer vector에 넣지 않는 방법)
#include <string> #include <vector>
#include <iostream> using namespace std; vector<string> solution(int n, vector<int> arr1, vector<int> arr2) { vector<string> answer;
for(int i = 0; i < n; i++){ arr1[i] |= arr2[i]; string ans = ""; for(int j = 0; j<n; j++){ if(arr1[i] % 2 == 0) ans = " " + ans; else ans = "#" + ans; arr1[i] = arr1[i] >> 1; } answer.push_back(ans); } return answer; }