[Lv.1][1차] 비밀지도

레이몬드 현식·2021년 12월 30일
0

코테

목록 보기
4/5

문제

[1차] 비밀지도

생각

문제에서 이진수에 해당하는 값의 배열이라고 나와서 일단 이진수로 바꿔야겠다고 생각했다.

1) 각각의 int형 벡터 배열(arr1, arr2)을 이진수로 표현하기 위해 이차원 벡터로 바꾼다.

2) 논리 or 연산자를 사용하여 문자열을 만든다. - 안쪽 for문

3) string 벡터에 문자열 push - 바깥쪽 for문

코드

#include <string>
#include <vector>

using namespace std;

vector<vector<int>> binarization(int n, vector<int> arr){	// 2진수 지도로 변환
    vector<vector<int>> map;
    int temp;
    
    for(int i=0; i<arr.size(); i++){
        vector<int> v(n);	// 하나의 숫자(10진수)를 2진수로 표현하기 위한 벡터
        temp=arr[i];	// 10진수
        for(int j=0; ; j++){
            if(temp==0 || temp==1){	// 더 이상 2로 나누어지지 않을 때
                v[n-1-j]=temp;
                break;
            }  
            v[n-1-j]=temp%2;	// 벡터의 뒤쪽부터 나머지 삽입
            temp/=2;
        }
        map.push_back(v);
    }
    return map;
}

vector<string> solution(int n, vector<int> arr1, vector<int> arr2) {
    vector<string> answer;
    vector<vector<int>> map1(binarization(n, arr1));	// arr1 2진수로 표현한 지도
    vector<vector<int>> map2(binarization(n, arr2));	// arr2 2진수로 표현한 지도
    
    for(int i=0; i<n; i++){
        string s = "";
        for(int j=0; j<n; j++){
            if(map1[i][j]||map2[i][j]==1){
                s+="#";
            }else
                s+=" ";
        }
        answer.push_back(s);
    }
    return answer;
}

채점하고 다른분들 풀이를 보니까 비트 or 연산자( | )를 사용해서 굳이 이진수로 안바꿔도 되는 걸 알게되었다...
+0 또는 1이 되었을 때 몫을 넣어줄 필요 없이 계속 나머지만 구하면 됨

#include <string>
#include <vector>

using namespace std;

vector<string> solution(int n, vector<int> arr1, vector<int> arr2) {
    vector<string> answer;
    
    for(int i=0; i<n; i++){
        string s="";
        arr1[i]=arr1[i]|arr2[i];	// bitwise or
        for(int j=0; j<n; j++){
            if(arr1[i]%2==0) s=" "+s;
            else s="#"+s;
            arr1[i]/=2;
        }
        answer.push_back(s);
    }   
    return answer;  
}

0개의 댓글