Algorithm/C++ - 프로그래머스

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

ㅇㅇ잉 2021. 3. 2. 16:23

이 문제는 진짜 답 보고 눈물 똑똑 흘렸다.

사실 안흘렸음

 

아니 근데 허무하긴 했다.

그냥 주먹구구식으로 어쩌구저쩌구 이러쿵저러쿵 막 풀었는데 풀고나서 다른 사람 풀이 보니까 엥..? 비트연산자..?

비트연산자 써볼 생각은 못했다.

 

일단 아래가 눈물나는 내 코드

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
#include <string>
#include <vector>
#include <iostream>
using namespace std;
 
int n1[16]={0,};
int n2[16]={0,};
 
 
vector<string> solution(int n, vector<int> arr1, vector<int> arr2) {
    vector<string> answer;
    for(int i=0;i<n;i++){
        
        int idx=n-1;
        while(arr1[i]!=0){
            n1[idx--]=(arr1[i]%2);
            arr1[i]/=2;
        }
        idx=n-1;
        while(arr2[i]!=0){
            n2[idx--]=(arr2[i]%2);
            arr2[i]/=2;
        }
        
        string str;
        for(int i=0;i<n;i++){
            if(n1[i] || n2[i]) str+="#";
            else str+=" ";
        }
        for(int i=0;i<n;i++){
            n1[i]=0;
            n2[i]=0;
        }
        answer.push_back(str);
    }
    
    return answer;
}
cs

 

 

그리고 이건 다른 사람이 푼 풀이

 

비트연산자에 아직 익숙하지 않아서 이렇게 간단히 풀 수 있구나 싶었다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#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++){
        arr1[i] = arr1[i]|arr2[i];
        string ans = "";
        for(int j = 0; j<n; j++){
            if(arr1[i] % 2 == 0) ans = " " + ans;
            else ans = "#" + ans;
            arr1[i] = arr1[i] >> 1;
        }
        answer.push_back(ans);
    }
    return answer;
}
cs

 

+풀이 추가

여기서 j<n까지 반복한 것은, 만약 2진수가 0010이면 10으로 나타나기때문에 n번 반복한 것이다.

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
#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++) {
        //논리합. 굳이 2진수로 바꿔서 비트연산자를 쓰지 않아도 된다.
        arr1[i] = arr1[i] | arr2[i];
        string ans = "";
        for (int j = 0; j < n; j++) {
            
            //%2연산은 bit 첫자리를 확인하기 위한 연산.
            //홀수면(첫번째 자리가 1이면) 1, 짝수(첫번째 자리가 0이면) 0이 나올 것이다.
            //맨뒷자리에서부터 계산을 시작하기때문에, ans에 넣어주는 형태를 보면
            //앞부분을 추가로 넣어주는 것을 볼 수 있다.
            if (arr1[i] % 2 == 0) ans = " " + ans;
            else ans = "#" + ans;
 
            //한칸씩 오른쪽으로 민다.
            //ex)1100 -> 110
            arr1[i] = arr1[i] >> 1;
        }
        answer.push_back(ans);
    }
    return answer;
}
cs