- 지도는 한 변의 길이가 n인 정사각형 배열 형태로, 각 칸은 공백 또는 # 두 종류로 이루어짐
- 전체 지도는 두장의 지도를 겹쳐서 얻음
- 1또는 2 둘 중 하나라도 벽이면 벽
- 지도 1과 지도 2는 각각 정수 배열로 암호화
- 암호화된 배열을 이진수로 변환했하여 0이면 공백 1이면 벽
- 원래의 비밀지도를 해독하여 '#', 공백으로 구성된 문자열 배열로 출력
비트연산
정수를 이진수로 표현하여 0 또는 1의 값을 가질 때, 한자리의 숫자를 비트(bit)라고 한다.
비트 연산자의 종류
& (ADN) | 모두 1이면 1을 반환 |
| (OR) | 하나라도 1이면 1을 반환 |
^ (XOR) | 서로 다르면 1을 반환 |
~ (NOT) | 값을 반전하여 반환 |
지도를 겹치면 나올 숫자를 체크합니다.
둘 중 하나라도 1이면 1을 반환하는 문제이므로 |(OR)을 사용하면 두 지도를 겹치는 것이 됩니다.
겹쳐서 나온 숫자를 2진수로 변환하여 0과 1로 나타내 줍니다.
2진수 변환
Object.prototype.toString() : 지정된 객체를 나타내는 문자열을 반환
Number.prototype.toString() : 특정한 Number 객체를 나타내는 문자열로 반환
Number.prototype.toString(2)를 넣으면 2진수를 나타내는 문자열을 얻을수 있습니다.
이렇게 구해진 숫자를 0과 1을 구분하여, 벽과 공백으로 나눠서 출력합니다.
초기 코드
글자를 변환하는 방법을 생각해내지 못해 과정이 복잡
function solution(n, arr1, arr2) {
var answer = [];
var password = [];
for (let i = 0; i < n; i++) {
// 지도 겹치기
password.push((arr1[i] | arr2[i]).toString(2)); // 비트 연산 후 이진수로 변환
}
answer = password.map(el => {
// 지도의 공백과 벽 구분하기
el = '0'.repeat(n - el.length) + el; // 모두 n자릿수로 맞춰줌
el = el.split(/(?:)/u); // 한글자씩 나눔
el = el.map (el2 => el2 == '0' ? ' ' : '#'); // 한글자씩 0과 1을 체크하여 변환
el = el.join(''); // 문자열 다시 합치기
return el; // 반환
});
return answer;
}
최종 코드
function solution(n, arr1, arr2) {
var answer = [];
return answer;
}
'프로그래머스 > JavaScript' 카테고리의 다른 글
[프로그래머스 JavaScript] Level2 H-Index (0) | 2020.06.16 |
---|---|
[프로그래머스 JavaScript] Level2 탑 (0) | 2020.06.15 |
[프로그래머스 JavaScript] Level1 실패율 (0) | 2020.06.09 |
[프로그래머스 JavaScript] Level1 예산 (0) | 2020.06.09 |
[프로그래머스 JavaScript] Level1 크레인 인형뽑기 게임 (0) | 2020.06.04 |