네오는 평소 프로도가 비상금을 숨겨놓는 장소를 알려줄 비밀지도를 손에 넣었다. 그런데 이 비밀지도는 숫자로 암호화되어 있어 위치를 확인하기 위해서는 암호를 해독해야 한다. 다행히 지도 암호를 해독할 방법을 적어놓은 메모도 함께 발견했다.
입력으로 지도의 한 변 크기 n 과 2개의 정수 배열 arr1, arr2가 들어온다.
function solution(n, arr1, arr2) {
var answer = [];
for(let i = 0;i<n;i++){
answer[i] = (arr1[i] | arr2[i]).toString(2);
while(answer[i].length < n)
answer[i] = '0'+answer[i];
answer[i] = answer[i].toString().replace(/1/g,'#').replace(/0/g,' ');
}
return answer;
}
✨ 비트 연산자
기호 : & , 문법 : a & 3 , 의미 : a와 3의 비트 논리곱 연산
기호 : | , 문법 : a | 3 , 의미 : a와 3의 비트 논리합 연산
기호 : ^ , 문법 : a ^ 3 , 의미 : a와 3의 배타적 논리합 연산
기호 : >> , 문법 : a >> 3 , 의미 : a의 비트열을 오른쪽으로 3칸 이동
기호 : << , 문법 : a << 3 , 의미 : a의 비트열을 왼쪽으로 3칸 이동
✨ .toString()
- 문자열을 반환하는 object의 대표적인 방법
- 기수를 이용함으로써 10진수를 (1, 2, 3, 4, 5...) 다른 진수로 변환할 수 있습니다.
ex. let baseTenInt = 10; console.log(baseTenInt.toString(2)); // "1010"이 출력됩니다
✨ .replace()
- 치환한다는 의미
g : 모든 패턴 체크(global)
i : 대소문자를 구별없이 체크
m : 여러줄 체크
.replace(' ','') : 첫번째 공백 제거
.replace(/-/g,'') : - 제거
.replace(/[-]/g,'')
.replace(/,/g,'') : , 제거
.replace(/^\s+/,'') : 앞의 공백 제거
.replace(/\s+/g,'') : 앞뒤 공백 제거
.replace(/\s/g,'') : 문자열 내의 모든 공백 제거
2가지 이상사용시 .replace(/[-]|\s/gi, ''); 등으로 |(or)을 가지고 사용가능 (-,공백제거)
출처 : replace 및 정규 공식
처음에 if else 를 사용해서 풀어보려고 했지만, 카카오가 이 문제에서 요구하는것은 바로 비트 연산을 사용해서 푸는거 였다. 처음에 풀었을 때
while(answer[i].length < n)
answer[i] = '0'+answer[i];
이 구간을 빼놓고 작성해서 두번째 예제 조건에 충족하지 못하였다.
이구간을 사용해야하는 이유는 입력한 n과 답의 길이가 같지 않다면 앞에 한칸 띄어쓰기를 입력해야한다.