Algorithm/Programmers(c++)

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

kim-hasa 2021. 7. 30. 14:40

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

 

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

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

programmers.co.kr

비밀지도를 해독하는 문제입니다. 

 

1. 숫자를 2진수로 변경해가면서 두 수중에 하나라도 자리수가 1이라면 1을 넣습니다.

2. 2진수가 반대로 들어가있으므로, 반대로 돌려서 출력합니다.

-> 출력하면서 1이라면 #, 0이라면 공백을 더해서 출력합니다.

 

처음에는 되게 문제 풀이에 감이 오지 않았는데, 한번 써보자! 하고 푸니까 쉽게 풀린 문제였습니다.

 

#include <string>
#include <vector>

using namespace std;

vector<string> solution(int n, vector<int> arr1, vector<int> arr2) {
    vector<string> answer;
    
    int map[16][16] = {0};  // 최대 2차원 배열 0으로 초기화
    int count = 0;          // 가로 index를 위한 변수
    
    for(int i=0; i<n; i++)
    {
        int a = arr1[i];
        int b = arr2[i];    // arr1, arr2의 숫자를 받아오는 변수
        
        while(a > 1 || b > 1)   // 2진수로 변경
        {
            int a2 = a % 2;
            int b2 = b % 2;
            
            if(a2 == 1 || b2 == 1)  // 나머지가 1이면 체크
            {
                map[i][count] = 1;
            }
            a = a/2;
            b = b/2;
            
            count++;
        }
        
        if(a == 1 || b == 1)        // 마지막 숫자 체크
        {
            map[i][count] = 1;
        }
        
        count = 0;
    }
    
    for(int i=0; i<n; i++)      // 문자로 변경
    {
        string str="";
        for(int j=n-1; j>=0; j--)   // 2진수가 반대로 들어가 있어서 뒤에서부터 체크
        {
            if(map[i][j] == 1)      // 1이라면 문자 #
            {
                str += '#';
            }
            else if(map[i][j] == 0) // 0이라면 공백
            {
                str += ' ';
            }
        }
        answer.push_back(str);
    }
    
    return answer;
}

※ 코드가 지저분할 수 있습니다.