🔻 [1차] 비밀지도
네오는 평소 프로도가 비상금을 숨겨놓는 장소를 알려줄 비밀지도를 손에 넣었다. 그런데 이 비밀지도는 숫자로 암호화되어 있어 위치를 확인하기 위해서는 암호를 해독해야 한다. 다행히 지도 암호를 해독할 방법을 적어놓은 메모도 함께 발견했다.
지도는 한 변의 길이가 n인 정사각형 배열 형태로, 각 칸은 "공백"(" ") 또는 "벽"("#") 두 종류로 이루어져 있다.
전체 지도는 두 장의 지도를 겹쳐서 얻을 수 있다. 각각 "지도 1"과 "지도 2"라고 하자. 지도 1 또는 지도 2 중 어느 하나라도 벽인 부분은 전체 지도에서도 벽이다. 지도 1과 지도 2에서 모두 공백인 부분은 전체 지도에서도 공백이다.
"지도 1"과 "지도 2"는 각각 정수 배열로 암호화되어 있다.
암호화된 배열은 지도의 각 가로줄에서 벽 부분을 1, 공백 부분을 0으로 부호화했을 때 얻어지는 이진수에 해당하는 값의 배열이다.![]()
네오가 프로도의 비상금을 손에 넣을 수 있도록, 비밀지도의 암호를 해독하는 작업을 도와줄 프로그램을 작성하라.
입출력 예
n 값 arr1 [9, 20, 28, 18, 11] arr2 [30, 1, 21, 17, 28] 출력 ["#####","# # #", "### #", "# ##", "#####"]
👀
JS에 진수 변환하는 메서드가 있었다.... 이제껏 직접 함수를 구현해서 진수 변환을 했는데(오히려 좋아) 역시 자바스크립트에는 없는게 없다..
처음에는 이진수 변환만 했는데, 원하는 결과가 안 나와서 왜일까? 했더니 정해진 길이의 이진수를 반환해야했다. 분명 메소드가 있을텐데~ 하고 찾아본 결과 역시나 있었다 😫
그나저나 엄청 복잡하고 긴 코드로 풀었는데 정말 쉽게 구현되어 있는 코드들을 보고 오늘도 열심히 해야지란 생각 가득..
// 진수 변환 함수
function binary(num, n) {
let binary = [];
while (Number(num) > 0) {
binary.unshift(Number(num) % 2)
num = parseInt(Number(num) / 2);
}
// 정사각형 길이에 맞도록 변환 후 앞을 0으로 채우기
return binary.join('').padStart(n, 0);
}
function solution(n, arr1, arr2) {
// 이진수로 변환한 값들 저장할 2차원 배열 초기화
let arr1_solved = []; let arr2_solved = []; let solved = [];
for (let i = 0; i < n; i++) {
arr1_solved[i] = [];
arr2_solved[i] = [];
solved[i] = [];
}
// 2진수로 변환하여 2차원 배열에 저장
arr1.forEach((v,index) => {
arr1_solved[index] = binary(v, n);
})
arr2.forEach((v,index) => {
arr2_solved[index] = binary(v,n);
})
// ||로 비교 후 # 또는 " " 넣어주기
for (let i = 0; i < n; i++) {
for (let j = 0; j < n; j++) {
Number(arr1_solved[i][j]) || Number(arr2_solved[i][j]) === 1 ?
solved[i] += "#" : solved[i] += " ";
}
}
return solved;
}
padStart() 메서드는 현재 문자열의 시작을 다른 문자열로 채워, 주어진 길이를 만족하는 새로운 문자열을 반환합니다. 채워넣기는 대상 문자열의 시작(좌측)부터 적용된다.
let str1 = "123";
let str2 = "12345";
console.log(str1.padStart(7, '0')); // "0000123"
console.log(str2.padStart(8, 'hi')); // "hih12345"
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;
}
10진수를 다른 진수로 변환하기
radix는 2와 36 사이의 정수
let arr1 = 8;
console.log(arr1.toString(2)); // 1000
다른 진수를 10진수로 변환하기
string이 아닌 number type을 반환한다
string : 변환시키고자 하는 문자열
radix : 해당 문자열의 진수 (string이 몇 진수로 쓰여있는지!)
let arr1 = 1000; // 2진수
// 2진수 arr1을 10진수로 바꿀래!
console.log(parseInt(arr1, 2); // 2진수 -> 10진수