본문 바로가기

Development/TIL

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

문제

항해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'