17681. [1차] 비밀지도 - 진수 변환toString(radix), parseInt(n, radix)

서진·2023년 6월 14일

programmers

목록 보기
19/33

🔻 [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;
}

✅ string.prototype.padStart(n, '')

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;
}

💡 Number.prototype.toString(radix)

10진수를 다른 진수로 변환하기
radix는 2와 36 사이의 정수

let arr1 = 8;

console.log(arr1.toString(2)); // 1000

💡 parseInt(string, radix)

다른 진수를 10진수로 변환하기
string이 아닌 number type을 반환한다

string : 변환시키고자 하는 문자열
radix : 해당 문자열의 진수 (string이 몇 진수로 쓰여있는지!)

let arr1 = 1000; // 2진수

// 2진수 arr1을 10진수로 바꿀래!
console.log(parseInt(arr1, 2); // 2진수 -> 10진수
profile
🫧 ☁️ 🌙 👩🏻•💻 🌿 🐱 🖱 🍟 🚀 ⭐️ 🧸 🍀 💗

0개의 댓글