<문제>
네오는 평소 프로도가 비상금을 숨겨놓는 장소를 알려줄 비밀지도를 손에 넣었다. 그런데 이 비밀지도는 숫자로 암호화되어 있어 위치를 확인하기 위해서는 암호를 해독해야 한다. 다행히 지도 암호를 해독할 방법을 적어놓은 메모도 함께 발견했다.
- 지도는 한 변의 길이가 n인 정사각형 배열 형태로, 각 칸은 "공백"(" ") 또는 "벽"("#") 두 종류로 이루어져 있다.
- 전체 지도는 두 장의 지도를 겹쳐서 얻을 수 있다. 각각 "지도 1"과 "지도 2"라고 하자. 지도 1 또는 지도 2 중 어느 하나라도 벽인 부분은 전체 지도에서도 벽이다. 지도 1과 지도 2에서 모두 공백인 부분은 전체 지도에서도 공백이다.
- "지도 1"과 "지도 2"는 각각 정수 배열로 암호화되어 있다.
- 암호화된 배열은 지도의 각 가로줄에서 벽 부분을 1, 공백 부분을 0으로 부호화했을 때 얻어지는 이진수에 해당하는 값의 배열이다.

네오가 프로도의 비상금을 손에 넣을 수 있도록, 비밀지도의 암호를 해독하는 작업을 도와줄 프로그램을 작성하라.
입력 형식
입력으로 지도의 한 변 크기 n 과 2개의 정수 배열 arr1, arr2가 들어온다.
- 1 ≦ n ≦ 16
- arr1, arr2는 길이 n인 정수 배열로 주어진다.
- 정수 배열의 각 원소 x를 이진수로 변환했을 때의 길이는 n 이하이다. 즉, 0 ≦ x ≦ 2n - 1을 만족한다.
출력 형식
원래의 비밀지도를 해독하여 '#', 공백으로 구성된 문자열 배열로 출력하라.
입출력 예제
매개변수값n | 5 |
arr1 | [9, 20, 28, 18, 11] |
arr2 | [30, 1, 21, 17, 28] |
출력 | ["#####","# # #", "### #", "# ##", "#####"] |
n | 6 |
arr1 | [46, 33, 33 ,22, 31, 50] |
arr2 | [27 ,56, 19, 14, 14, 10] |
출력 | ["######", "### #", "## ##", " #### ", " #####", "### # "] |
<제출답안>
너무 코드가 길어서 부끄럽지만 그래도 답은 안보고 풀었다.
function solution(n, arr1, arr2) {
let answer = [];
let temp = Array(n).fill(0); //임시공간: #을 생성하는 곳
let compo = '';
let compo2 = '';
for(let i=0; i<n; i++) { //arr1
// 제작후에 #으로 바꿔주고 나서 비교후에 합쳐줘야함.
compo = [...arr1[i].toString(2)];
compo2 = [...arr2[i].toString(2)];
// console.log(compo)
if(compo.length !== n){
let difference = n - compo.length
for(let j=0; j< difference; j++){
compo.unshift("0");
}
}
if(compo2.length !== n){ // arr2의 요소가 n과 길이가 다르면 추가
let difference = n - compo2.length
for(let k=0; k< difference; k++){
compo2.unshift("0");
}
}
// console.log(compo)
// console.log(compo2[0])
for(let l=0; l<n; l++){
temp[l] = " ";
if (compo[l] == "1" || compo2[l] == "1" ){
// arr2의 요소와 arr1의 요소가 1이면 1을 temp의 그 인덱스를 1로 변경
temp[l] = "#";
}
}
answer.push(temp.join(""))
}
return answer
}
중간에 여기서 자꾸 n, compo2.length는 값이 생각대로 나오는데
n-compo2.length 는 먹히지 않아서 챗gpt에게 물었다.
결론은
'아 ... 조건문에서 n값이 바뀌면 다음 루프의 n값에 영향을 미치는구나' 였다.
위에 difference 변수에 따로 저장해서 n 값이 바뀌지 않도록 신경써주었다.
1
2
3
4
5
6
|
if(compo2.length !== n){ // arr2의 요소가 n과 길이가 다르면 추가
console.log(compo2.length)
for(let k=0; k< (n - compo2.length); k++){
compo2.unshift("0");
console.log(compo2)
}
|
cs |
<다른답안>
누군가는 이렇게 간단하게...
function solution(n, arr1, arr2) {
let num1, num2, s;
let answer = [];
//manually turning decimals to binaries cos i can!
for (let i=0; i<n; i++){
num1 = arr1[i];
num2 = arr2[i];
s = '';
for (let j=0; j<n; j++){
s = (num1%2 + num2%2) ? '#'+s : ' '+s;
num1 = Math.floor(num1/2);
num2 = Math.floor(num2/2);
}
answer.push(s);
}
return answer;
}
'🗃️javascript > 프로그래머스' 카테고리의 다른 글
2016년(js , Lv1)[객체 사용] (0) | 2023.11.13 |
---|---|
접미사인지 확인하기(LV.0)[계속 생각하면 좋은 코드가 나올지도?] (0) | 2023.09.07 |
공백으로 구분하기 2(Lv.0)[마음이 급하면 쉬운것도 잘 안되네] (0) | 2023.09.06 |
홀수 vs 짝수(Lv.0)[map은 기존 배열 수정x || forEach는 기존 배열수] (0) | 2023.09.05 |
배열 만들기 1(Lv.0)[Array(배열길이).fill(채울요소)] (0) | 2023.09.05 |