알고리즘/프로그래머스 1단계

프로그래머스 - 비밀지도 - C++

게임만드는학생 2024. 7. 16. 18:28

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

int mn;

vector<bool> Convert(int num)
{
    vector<bool> b;
    while (num > 0)
    {
        b.push_back(num % 2);
        num /= 2;
    }
    if (mn > b.size())
    {
        while (mn != b.size())
        {
            b.push_back(false);
        }
    }
    reverse(b.begin(), b.end());
    return b;
}

vector<string> solution(int n, vector<int> arr1, vector<int> arr2) {
    vector<string> answer;
    mn = n;
    for (int i = 0; i < n; i++)
    {
        vector<bool> bit = Convert(arr1[i]);
        vector<bool> bit2 = Convert(arr2[i]);
        string s = "";
        for (int j = 0; j < n; j++)
        {
            if (bit[j] | bit2[j])
                s += '#';
            else
                s += ' ';
        }
        answer.push_back(s);
    }
    return answer;
}

 

주어진 정수배열을 2진수로 바꿔 나타낸 두 지도에서 비트연산자를 통해서 비밀지도 만들었다.

 

먼저 Convert라는 정수를 넘겨주면 bool 형 벡터를 반환하는 형태로 정의하였다. 

 

n 크기의 정사각형이기 때문에 이중포문을 n번씩 돌리며 비밀지도의 한 줄 즉, 각 배열의 정수 1개씩에 대해서

이진수배열을 or연산하였다. 

 

하나라도 벽이면 벽이라도 하기 때문에 #을 추가하고 아니면 공백을 추가한다. 

 

그리고 answer에 푸시한다. 

 

에러를 수정하는데 시간이 걸렸는데 근거없이 주어진 숫자들은 2진수로 바꾸면 n크기의 이진수배열이 될것이라고 생각한 것이다. 하지만 n크기가 되지않으면 앞에 0을 넣었어야 한다는 것을 깨닫고 해결하였다.