[프로그래머스] Lv.2 다음 큰 숫자 Javascript 풀이

손규성·2022년 9월 25일
1

alogrithm

목록 보기
3/22
post-thumbnail

문제 설명✍️

이 문제는 n이라는 자연수가 입력되었을 때, 다음 큰 숫자를 반환하는 함수를 만드는 문제다.
문제 확인하기

문제 이름만 보면 입력값의 다음 자연수를 찾는 문제 같지도 않은 문제일 거라고 착각할 수 있지만, 사실 이 문제의 핵심은 '다음 큰 숫자'라는 것이 의미하는 것을 파악하는 것부터 시작한다.


다음 큰 숫자의 조건

다음 큰 숫자의 조건은 다음과 같다.

  • n의 다음 큰 숫자는 n보다 큰 자연수
  • n의 다음 큰 숫자와 n은 2진수로 변환했을 때 1의 갯수 같음
  • n의 다음 큰 숫자는 조건 1, 2를 만족하는 수 중 가장 작은 수

즉, n이라는 입력값이 주어졌을 때 다음 큰 숫자xx > n이고, 2진수로 변환했을 때 x.toString(2) 1의 갯수가 n.toString(2)랑 동일하는 숫자 중 가장 작은 숫자이다.


문제 풀이

function countOne(num) {
    let count = 0, ejin = num.toString(2).split('');
    for(let i = 0; i < ejin.length; i++) {
        if (ejin[i] == 1) { count++; }
    }
    return count; 
}

function solution(n) {
    let testNum = n;
    while(true) {
        testNum++; 
        if(countOne(testNum) == countOne(n)) return testNum;
    }
}

처음에는 이렇게 두 개의 함수를 만들었다.

  • countOne(num)은 자연수를 입력받고 2진수 변환 후 1의 갯수를 세어주는 함수
  • solution(n)은 반복문과 countOne(num)을 통해 n의 1의 갯수와 다음 자연수들의 1의 갯수를 비교하고, 일치하는 값을 찾았을 때 멈추는 함수

이렇게 풀어도 효율성 테스트까지 문제 없이 바로 통과할 수 있었다.

근데 작성한 코드를 쳐다보고 있다보니 더 간결하고, 더 읽기 쉽게 작성할 수 있을 것 같다는 생각이 들었다.

더 간결한 문제풀이

function solution(n) {
    let oneNum = n.toString(2).split("1").length;
    while (true) {
      n++;
      if (n.toString(2).split("1").length === oneNum) return n;
    }
  }

split("1").length를 통해 2진수로 변환된 값의 1의 갯수를 손쉽게 찾을 수 있었고,
덕분에 조금 더 간결하고 만족스러운 코드를 작성할 수 있었다.

앞으로도 단순 문제풀이에만 만족하지 않고 조금 더 간결하고 읽기 편한 코드를 작성하도록 연습할 예정이다👍

profile
블로그 이사 → https://sqsung.tistory.com/

0개의 댓글