정수 배열 2개를 주어졌을때 비트 연산을 통하여 최종 출력되는 크기 n의 지도를 문자로 해석해 반환하는 문제이다.
pseudo code
- 두개의 정수 배열을 비트 연산하기
- 비트연산한 결과를 문자로 변경하기
- 생성된 문자열을 최종 조건에 맞춰 변경하기
- 최종 결과 배열에 입력하기
문제점
지도를 bit로 표기를 하였다. 자리수가 1이면 '#', 0이면 '공백'을 의미한다. 또한 자릿수의 길이는 n이라 주어진다.
지도의 각각의 줄의 bit연산을 통해 나온 결과를 문자로 변환화는 과정에서 끝의 자리부터 읽다보니 최종 답과 반대로 문자열이 생성이 된다. 이 문자열을 다시 reverse를 해줘야 비로소 최종 원하는 결과값이 나온다.
bit연산
메모리의 효율적인 사용을 위하여 고안된 방법이다.
bitset의 헤더파일에 존재한다.
연산 종류로는 &(AND) |(OR) ^(XOR) ~(NOT) >>(right shift) <<(left shift)이 있다.
여기서 사용된 연산은 | 연산으로, 해당되는 모든 곳을 표시해야하기 때문이다.
bit는 unsigned로 변수를 생성하면 좋다.
reverse()
string헤더파일에 있는 줄 알았는데 algorithm헤더파일 소속이였다.
인자로 받는 구간의 요소를 뒤집어준다.
reverse(vec.begin(),vec.end())
코드
#include <string>
#include <vector>
#include <bitset>
#include <algorithm>
using namespace std;
vector<string> solution(int n, vector<int> arr1, vector<int> arr2) {
vector<string> answer;
for(int i = 0 ; i< arr1.size();i++){
unsigned int temp = arr1[i] | arr2[i];
string tmp_answer="";
for(int j = 0 ; j<n;j++){
if(temp % 2 == 1 ){
tmp_answer += "#";
}
else{
tmp_answer += " ";
}
temp = temp>>1;
}
reverse(tmp_answer.begin(),tmp_answer.end());
answer.push_back(tmp_answer);
}
return answer;
}