한 걸음씩

[프로그래머스][JS] 이진 변환 반복하기 본문

Programmers

[프로그래머스][JS] 이진 변환 반복하기

winter17 2023. 6. 29. 13:14

https://school.programmers.co.kr/learn/courses/30/lessons/70129

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

풀이 과정

// 통과
function solution(s) {
    let zero = 0
    let total = 0
    let convert = s.slice() // 깊은 복사를 하지 않아도 통과함
    while (convert !== '1'){
        let noZero = ''
        let cnt = 0
        for (let i = 0; i < convert.length; i++){
            if (convert[i] === '1'){
                noZero += '1'
            }else{
                cnt++
            }
        }
        convert = noZero.length.toString(2)
        total++
        zero += cnt
    }
    return [total, zero];
}

 

// 통과
function solution(s) {
    let zero = 0
    let total = 0
    let convert = s.slice()
    while (convert !== '1'){
        let noZero = [...convert].filter(item => item === '1').join('');
        let cnt = convert.length - noZero.length; // 0의 개수

        convert = noZero.length.toString(2)
        total++
        zero += cnt
    }
    return [total, zero];
}

 

세 번의 시도 끝에 통과를 했는데

첫 시도 때는 filter를 통해서 0과 1을 분리한 후 join을 사용해 문자열로 만들어주었는데 실패

두 번째 시도 때는 위의 과정을 for문을 사용해서 0과 1을 분리했지만 또 실패

마지막으로 while문 조건에서 convert!== '10'인 경우를 convert!== '1'로 변경하고 리턴 때 [total +1, zero +1]했던 부분에서 +1을 뺀 채로 리턴했더니 통과를 했다.

 

while문 조건을 잘못설정해서 발생한 오류였다.

문제에서는 1이 되면 종료하라고 했는데 입출력 예제만 보고 '10'이면 종료하면 되겠구나!라고 생각하고 조건을 맞췄는데

convert !== '10'으로 설정하면 1번의 반복을 더 해야 한다. '1' 될 때까지 이진 변환을 해라는 문제 조건이 있었기 때문

그래서 내가 임의로 마지막 리턴 때 + 1을 해준 거였는데

만약 변환 횟수가 0이고 제거된 0의 개수가 0인 경우 [1, 1]을 반환하는데 여기서 오류가 발생하는 것이다. 

 

입출력 예시에 이진 변환 이전 케이스까지만 보고 코드를 짰더니 오류가 계속 발생했다... '1'이 돼야 반복이 종료한다는 것!


리뷰

입출력 예제에 맞춰서 코드를 짜다 보니 발생한 오류이고, 너무 사소한 실수인데 그 때문에 통과를 못했다는 게 너무 어이가 없다.

다음부턴 이런 실수를 안 해야 할 텐데..