Development/TIL

TIL(feat.프로그래머스 1차 비밀지도)

redjun89 2023. 4. 13. 22:21

문제

항해99 본과정 알고리즘 주차 마지막 날이다.

프로그래머스 1차 비밀지도 문제에서 막히는 부분이 발생했다.

주어진 숫자를 이진법으로 변환해서 활용해야하는데

문제는 이진법으로 변환한 숫자를 주어진 길이인 n만큼 맞춰줘야한다는 것이었다.

예를들면 n = 5 였을 때 숫자 9를 이진법으로 변환하면 1001이 된다.

1001의 길이는 4이기 때문에 조건을 맞추려면 앞에 0을 붙여줘야한다.

하지만 아무리 해도 앞에 0이 붙지 않았다.....

 

문제링크

 

 

 

시도

function solution(n, arr1, arr2) {
    let arr1Binary = [];
    arr1.map((a) => arr1Binary.push(a.toString(2)))
    
    let arr2Binary = [];
    arr2.map((a) => arr2Binary.push(a.toString(2)))
    
    let answer = new Array(n).fill('')
    // .map((a) => a.padStart(n, '#'));
    
    for (let i = 0; i < n; i++) {
        for (let j = 0; j < n; j++) {
            if (arr1Binary[i][j] === '0' && arr2Binary[i][j] === '0') {
                answer.splice(i, 0, ' ')
            } else if (arr1Binary[i][j] === '1' || arr2Binary[i][j] === '1') {
                answer.splice(i, 0, '#')
            }
        }
    }
    
    return answer
}

빈 배열을 선언하여 arr1과 arr2의 각 요소를 이진수로 변환해서 넣어준 것 까지는 좋았는데

다음 단계로 넘어가려면 이진수의 길이가 n 미만이면 앞에 0을 붙여줘야했다.

하지만 이렇게 저렇게 해봐도 붙여지지가 않았다.

 

 

 

해결

function solution(n, arr1, arr2) {
    let arr1Binary = [];
    arr1.map((a) => arr1Binary.push(a.toString(2).padStart(n, '0')))
    
    let arr2Binary = [];
    arr2.map((a) => arr2Binary.push(a.toString(2).padStart(n, '0')))
    
    let answer = new Array(n).fill('')
    // .map((a) => a.padStart(n, '#'));
    
    for (let i = 0; i < n; i++) {
        for (let j = 0; j < n; j++) {
            if (arr1Binary[i][j] === '0' && arr2Binary[i][j] === '0') {
                answer[i] += ' '
            } else if (arr1Binary[i][j] === '1' || arr2Binary[i][j] === '1') {
                answer[i] += '#'
            }
        }
    }
    
    return answer
}

결국 구글링을 통해 해결 방법을 찾았다.

바로 padStart 메서드였다.

문자열에 원하는 길이만큼 특정 문자를 붙여주는 기특한 녀석이다.

그래서 n 길이가 맞춰지도록 0을 넣어주었다. 그래서 다음 단계로 나아갈 수 있었는데....

또 문제가 생겼다.

반복문을 돌려서 두 배열의 같은 인덱스에 있는 요소를 비교한 후 결과에 따라

공백 또는 #을 넣어주어야하는데 넣어지지가 않았다.....

각 배열에 요소들이 문자열로 들어가 있는데 2차원 배열로 생각하고 자꾸 배열 메서드로 붙여주려고 한 것이 문제였다.

다시 한번 나의 멍청함에 개탄을 하며 위와 같이 수정해주었다.

그래서 해결 완료!!

 

 

 

알게된 것

문자열 앞 혹은 뒤에 자리수만큼 특정 문자 채우기!!

유용한 메서드를 알게 되었다. 부디 까먹지 않기를.....

그리고 데이터 타입을 꼭 염두에 두고 코드를 짜자!!!

 

문자열 앞에 채우기

let str = '123'
str.padStart(5, '0') //'00123'



문자열 뒤에 채우기

let str = '123'
str.padEnd(5, '0') //'12300'