2018년 카카오 블라인드 테스트 1차 비밀지도 문제(문제 번호 17681
). 파라미터는 arr1
arr2
n
이렇게 3개를 받으며, n
은 한 변의 길이를 나타낸다(배열 각 요소를 이진수로 변환한 후의 length
).
2개의 배열을 받아
[9, 20, 28, 18, 11] // arr1
[30, 1, 21, 17, 28] // arr2
배열의 각 요소를 2진수로 변환한 뒤 (10진수 → 2진수 변환은 노트 참고)
['01001', '10100', '11100', '10010', '01011'] // arr1
['11110', '00001', '10101', '10001', '11100'] // arr2
0
→ ' '
공백, 1
→ #
으로 변환
[' # #', '# # ', '### ', '# # ', ' # ##'] // arr1
['#### ', ' #', '# # #', '# #', '### '] // arr2
각 배열 병합. arr1[i][j]
와 arr2[i][j]
를 비교할 때 둘 중 하나라도 #
이면 그대로 #
사용
// arr1, arr2 첫번째 요소 비교
' # #'
'#### '
-------
'#####'
["#####","# # #", "### #", "# ##", "#####"]
해결 방식을 그림으로 표현하면 아래와 같다
map
reduce
를 이용해서 원시적으로 풀었다.
배열 각 요소를 2진수로 변환
const convertToBinary= arr => {
return arr.reduce((acc, cur) => {
let converted = cur.toString(2);
converted = '0'.repeat(n - converted.length) + converted;
return acc.concat(converted);
}, []);
};
const map1 = convertToBinary(arr1);
const map2 = convertToBinary(arr2);
일부 숫자는 이진수 변환 후의 length
가 n
보다 작기 때문에 repeat()
메서드로 자릿수를 맞춰준다.
// length(자릿수)가 맞지 않기 때문에 두 이진수를 비교하기 애매하다
'1001' // 숫자 9 이진수(arr1[0][0])
'11110' // 숫자 30 이진수(arr2[0][0])
// repeat 메서드를 사용해 숫자 9 이진수의 부족한 자릿수만큼 '0' 추가
// n은 5라고 가정
'0'.repeat(n - '1001'.length) + '1001' // '01001'
0
→ ' '
공백, 1
→ #
으로 변환 — 이 부분은 OR
비트 연산자로 깔끔하게 풀 수 있다
return map1.map((el, i1) =>
el
.split('')
.reduce(
(acc, cur, i2) =>
cur === '1' || map2[i1][i2] === '1' ? acc + '#' : acc + ' ',
'',
),
);
비트 연산자 참고글
<aside> 💡 비트는 이진(Binary) 숫자만 사용한다. 비트 연산자는 비트 수준에서 변수와 상호 작용하는 방법이다. 비트 수준에서의 평가는 일반 논리연산자보다 속도가 빠르다.
</aside>
좋아요를 가장 많이 받은 다른 사람 코드를 보니 정말 깔끔하다. v | arr2[i]
요 코드는 단순히 OR
연산자를 사용한지 알았는데 자세히 보니 Vertical Bar |
가 하나밖에 없다. 찾아보니 비트연산자의 OR
이다.