이 문제는 진짜 답 보고 눈물 똑똑 흘렸다.
사실 안흘렸음
아니 근데 허무하긴 했다.
그냥 주먹구구식으로 어쩌구저쩌구 이러쿵저러쿵 막 풀었는데 풀고나서 다른 사람 풀이 보니까 엥..? 비트연산자..?
비트연산자 써볼 생각은 못했다.
일단 아래가 눈물나는 내 코드
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 |