카테고리 없음

[프로그래머스] 비밀지도

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