Programmers/Level 1

C++ / 프로그래머스 / [1차] 비밀지도

GitHubSeob 2021. 8. 30. 16:51

문제

https://programmers.co.kr/learn/courses/30/lessons/17681

 

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

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

programmers.co.kr

문제풀이

비트 마스크를 이용하여 푸는 문제이다.

arr1 배열과 arr2 배열의 or연산을 해서 두 배열중 하나라도 1이 있으면 해당 자리는 1이 된다.

그다음 해당 숫자가 1이면 #을, 0이면 공백 1칸을 출력하는 문제이다.

arr1 [idx] |= arr2 [idx]을 하여 비트 or연산을 arr1배열에 집어넣는다.

        for (idx2 = n - 1; idx2 >= 0; --idx2) {
            if (arr1[idx] & (1 << idx2))
                input += '#';
            else input += ' ';
        }

배열의 맨 앞자리부터 이진수로 바꿨을 때 해당 자리가 1이면 #을 input에 더하고 0이면 공백 1칸을 더한다.

answer.push_back(input);

 

 

배열의 값 하나의 판별이 끝났으면 answer에 push 하고 다음 배열의 값을 판별한다.

 

코드

#include <string>
#include <vector>

using namespace std;

vector<string> solution(int n, vector<int> arr1, vector<int> arr2) {
    vector<string> answer;
    int idx = 0;
    int idx2 = 0;

    for (idx = 0; idx < n; ++idx) {
        string input = "";
        arr1[idx] |= arr2[idx];
        for (idx2 = n - 1; idx2 >= 0; --idx2) {
            if (arr1[idx] & (1 << idx2))
                input += '#';
            else input += ' ';
        }
        answer.push_back(input);
    }

    return answer;
}