문제설명 :
네오는 평소 프로도가 비상금을 숨겨놓는 장소를 알려줄 비밀지도를 손에 넣었다. 그런데 이 비밀지도는 숫자로 암호화되어 있어 위치를 확인하기 위해서는 암호를 해독해야 한다. 다행히 지도 암호를 해독할 방법을 적어놓은 메모도 함께 발견했다.
네오가 프로도의 비상금을 손에 넣을 수 있도록, 비밀지도의 암호를 해독하는 작업을 도와줄 프로그램을 작성하라.
제한 사항
입력으로 지도의 한 변 크기 n 과 2개의 정수 배열 arr1, arr2가 들어온다.
원래의 비밀지도를 해독하여 '#', 공백으로 구성된 문자열 배열로 출력하라.
입출력 예
n | arr1 | arr2 | Return |
5 | [9, 20, 28, 18, 11] | [30, 1, 21, 17, 28] | ["#####", "# # #", "### #", "# ##", "#####"] |
6 | [46, 33, 33, 22, 31, 50] | [27, 56, 19, 14, 14, 10] | ["######", "### #", "## ##", " #### ", " #####", "### # "] |
첫번째 접근
: 반복문을 사용해 두 개의 배열(arr1, arr2)를 돌며 각 숫자를 이진수로 바꾼 후 n만큼의 자릿수를 맞춰주기 위해 while문을 사용해 이진수 앞에 0을 붙여주었다. 이후 for 문을 돌려 num1과 num2의 특정 자리에 1이 포함되어 있는지 여부를 확인한 후 포함되어 있으면 변수 str에 '#'을 더해주고 그렇지 않으면 빈 스트링을 더해주었다. 이렇게 만들어진 str은 반복문이 실행될 때 마다 배열 arr에 push해 주었다.
function solution(n, arr1, arr2) {
let arr = []
for(let i = 0; i < n; i++){
let str = ''
let num1 = arr1[i].toString(2)
let num2 = arr2[i].toString(2)
while(num1.length < n){ num1 = 0 + num1}
while(num2.length < n) {num2 = 0 + num2}
for(let j = 0; j < n; j++){
str += [num1[j], num2[j]].includes('1') ? '#' : " "
}
arr.push(str)
}
return arr
}
solution
function solution(n, arr1, arr2) {
return arr1.map((v, i) => addZero(n, (v | arr2[i]).toString(2)).replace(/1|0/g, a => +a ? '#' : ' '));
}
const addZero = (n, s) => {
return '0'.repeat(n - s.length) + s;
}
// (v | arr2[i]).toString(2) : 비트 or 연산을 사용해 반환되는 하나의 숫자를 이진수로 바꾸었다.
// /1|0/g
: 정규 표현식
: '/'는 정규 표현식의 시작과 끝을 나타내는 구분 기호
: '1|0'는 1 또는 0 문자열을 찾는 패턴
: 'g'는 globa(전역) 검색을 의미하며 패턴과 일치하는 모든 부분을 찾음
// replace
: 첫번째 인자로 전달된 패턴과 일치하는 부분을 두 번째 인자로 전달된 값으로 대체
: 1 또는 0을 찾아 a로 전달한 후 숫자로 변환해 1(true)이면 '#'을 0(false)이면 ' '으로 대체
JS Practice) 프로그래머스 Lv.1 : 문자열 내 마음대로 정렬하기 (0) | 2023.07.22 |
---|---|
JS Practice) 프로그래머스 Lv.1 : 숫자 문자열과 영단어 (0) | 2023.07.20 |
JS Practice) 프로그래머스 Lv.1 : 크기가 작은 부분문자열 (0) | 2023.07.18 |
JS Practice) 프로그래머스 Lv.1 : 직사각형 별찍기 (0) | 2023.07.11 |
JS Practice) 프로그래머스 Lv.1 : 삼총사 (0) | 2023.07.10 |
댓글 영역