문제
생각
문제에서 이진수에 해당하는 값의 배열이라고 나와서 일단 이진수로 바꿔야겠다고 생각했다.
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;
}