문제풀이/프로그래머스

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

Hyeon-Uk 2021. 6. 19. 21:23
반응형

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

 

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

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

programmers.co.kr


 

-풀이-

먼저, 두 비밀지도의 각 행끼리 or연산을 해준 값을 구한 뒤, 2로 나누면서 0이면 " "을, 1이면 "#"을 str의 뒤에 추가를 해준다. 단, str의 길이가 n이 아니라면, str의 앞에 사이즈가 n이될때까지 " "를 추가해준다 

ex)

arr1[0]=9, arr2[0]=30 일때, or연산을 하면 31이 된다.

63을 2진수로 바꾸면, 11111이 되므로, answer에 "#####"을 push,

arr1[1]=20, arr2[1]=1 이므로, or연산을 하면 21이 된다.

21을 2진수로 바꾸면, 10101이 되므로 answer에 "# # #"을 push,

만약 or연산을 한 값을 2진수로 바꿨을때, 1111과 같이, n의 자리를 만족하지 못하면, 앞에 공백을 추가하여 n의 자리를 맞춘 " ####"을 push

 

-시간복잡도-

arr1의 크기를 N이라고 한다면, O(N)

 

-코드-

 

#include <string>
#include <vector>

using namespace std;

vector<string> solution(int n, vector<int> arr1, vector<int> arr2) {
    vector<string> answer;
    vector<int> arr3;
    for(int i=0;i<arr1.size();i++){
        int now=arr1[i]|arr2[i];
        string str="";
        while(now>0){
            str=(now%2==0?" ":"#")+str;
            now/=2;
        }
        if(str.size()!=n){
            while(str.size()<n){
                str=" "+str;
            }
        }
        answer.push_back(str);
    }
    
    return answer;
}
반응형