네오는 평소 프로도가 비상금을 숨겨놓는 장소를 알려줄 비밀지도를 손에 넣었다. 그런데 이 비밀지도는 숫자로 암호화되어 있어 위치를 확인하기 위해서는 암호를 해독해야 한다. 다행히 지도 암호를 해독할 방법을 적어놓은 메모도 함께 발견했다.
네오가 프로도의 비상금을 손에 넣을 수 있도록, 비밀지도의 암호를 해독하는 작업을 도와줄 프로그램을 작성하라.
입력으로 지도의 한 변 크기 n 과 2개의 정수 배열 arr1, arr2가 들어온다.
원래의 비밀지도를 해독하여 '#', 공백으로 구성된 문자열 배열로 출력하라.
n = 5
arr1 = [9, 20, 28, 18, 11]
arr2 = [30, 1, 21, 17, 28]
출력 = ["#####","# # #", "### #", "# ##", "#####"]
이 문제는 단순히 배열의 숫자를 이진법으로 덧셈을 하여 구하는 문제가 아니다. 우선 배열 안에 있는 모든 원소들을 이진법으로 바꿔준 다음 각 i번째 이진수끼리 덧셈을 해줘야 한다. 단순히 문자열을 더하는 것이 아니기 때문에 각 이진수를 배열로 변환해준 다음 arr1 과 arr2의 원소가 둘 다 0일 때에만 0으로 출력이 되고 아닌 경우에는 무조건 1이 출력되도록 한다.
이후에 해당 문자열에서 "1"은 "#"으로, "0"은 " "으로 바꿔준다. 그리고 해당 문자열을 새로운 배열에 push 해주면 된다.
주의해야할 점은 배열 안에 있는 문자열 역시 배열로 만들어줘야 하는데 그 배열을 for 문 안에서 정의해줘 순회할 때마다 새롭게 초기화 해주는 역할을 해준다. 또한 n의 크기에 따라서 이진수로 변환했을 때 n자리수가 아니라면 앞자리를 0으로 처리해줘야만 한다.
정수를 이진수로 바꿔주는 역할을 한다. toString()
이기 때문에 결과값은 문자열임을 명심해야 한다.
padStart()
의 첫번째 인자는 자릿수를 의미하고 그 자릿수를 채우지 못한다면 채워줄 문자를 두번째 인자로 적어준다.
문자열을 배열로 바꿔주는 역할을 한다.
문자열에서 첫번 째 인자에 적힌 문자를 모두 두번 째 인자로 바꾸는 역할을 한다.
function solution(n, arr1, arr2) {
let resultArr = [];
for(let i=0; i<n; i++){
let newArr1 = arr1[i].toString(2).padStart(n,'0').split('');
let newArr2 = arr2[i].toString(2).padStart(n,'0').split('');
let str = "";
for(let j=0; j<newArr1.length; j++){
if(newArr1[j] === "0" && newArr2[j] === "0") str += "0";
else str += "1";
}
str = str.replaceAll("1", "#");
str = str.replaceAll("0", " ");
resultArr.push(str);
}
return resultArr;
}
카카오 문제 너무 어렵네요.. 좋은 풀이 감사합니다~