프로그래머스의 비밀지도(Lv1) 문제이다.

 

[ 문제풀이 ]

2개의 맵을 합쳐서 새로운 하나의 맵을 완성해야 하는 문제이다.

맵을 만드는 과정부터 정답을 도출하는 과정까지 순차적으로 알아보자.

 

#1. 맵 만들기

본인은 주어진 10진수 숫자를 2진수로 바꿔서 공백부분을 0, 벽을 1로 가지는 맵을 만들어 주었다.

맵으로 만들어 주는 과정은 다음과 같다.

1. 주어진 10진수 숫자를 2진수로 변환한다. 이 때, 변환된 2진수는 string형태로 저장을 해준다.

2. 변환 과정에서 0은 공백으로, 1은 '#'으로 표현해서 문자열을 저장해준다.

3. 남은 칸 만큼 앞을 공백으로 채워준다.

1, 2번 과정은 크게 어려운 점이 없는데 3번 과정에 대해서 이야기를 해보자.

맵의 크기가 '5'이고 주어진 10진수 숫자로 '9'가 주어졌다고 가정해보자.

이 때, 과정 1 , 2를 진행해보자.

9를 2진수로 변환하게 되면 '1001(2)' 이 되고, 이를 공백과 '#'을 이용해서 표현하면 '#  #' 이 된다.

그런데 문제는 맵의 크기가 '5'라는 것이다. 맵의 크기는 '5'인데 우리가 변환한 2진수는 길이가 4인 string이 되는 것이다.

이를 크기가 5인 맵에 집어넣으려면 ' #  #' 과 같이 앞에 공백을 한칸 더 넣어주어야 한다.

즉 ! 01001(2) 로 표현하는 것이다. 따라서, 맵의 크기와 2진수로 바꾼 문자열의 길이를 비교해서 부족한 칸 수 만큼 앞에 공백을 추가적으로 넣어주어야 한다.

 

이렇게 2개의 맵을 만들었다면, 맵을 합치는 과정은 상관이 없다.

2개 모두 공백일 때만 공백을 넣어주고 그게 아닌 경우에는 벽을 넣어주면 새로운 맵을 완성시킬 수가 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <string>
#include <vector>
#include <algorithm>
 
using namespace std;
 
string Convert_To_Binary(int n, int Num)
{
    string Result = "";
    while (Num > 0)
    {
        int Temp = Num % 2;
        if (Temp == 1) Result += '#';
        else Result += ' ';
        Num /= 2;
    }
    string R_Value = "";
    for (int i = 0; i < n - Result.length(); i++) R_Value += ' ';
    reverse(Result.begin(), Result.end());
    R_Value += Result;
    return R_Value;
}
 
vector<string> solution(int n, vector<int> arr1, vector<int> arr2) 
{
    vector<string> answer;
    vector<vector<char>> MAP1(n, vector<char>(n));
    vector<vector<char>> MAP2(n, vector<char>(n));
 
    int Idx = 0;
    for (int i = 0; i < arr1.size(); i++)
    {
        int Num = arr1[i];
        string Binary_Num = Convert_To_Binary(n, Num);
        for (int j = 0; j < n; j++)    MAP1[Idx][j] = Binary_Num[j];
        Idx++;        
    }
    Idx = 0;
    for (int i = 0; i < arr2.size(); i++)
    {
        int Num = arr2[i];
        string Binary_Num = Convert_To_Binary(n, Num);
        for (int j = 0; j < n; j++)    MAP2[Idx][j] = Binary_Num[j];
        Idx++;
    }
    for (int i = 0; i < n; i++)
    {
        string Result = "";
        for (int j = 0; j < n; j++)
        {
            if (MAP1[i][j] == ' ' && MAP2[i][j] == ' ') Result += ' ';
            else Result += '#';
        }
        answer.push_back(Result);
    }
    return answer;
}
cs

 

 

 

 

 

+ Recent posts