[프로그래머스/js] 다음 큰 숫자 (Lv. 2)

2025. 3. 25. 17:00·공부/코딩테스트

문제

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

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

프로그래머스 :: 다음 큰 숫자 :: Lv. 2

 

문제 리뷰

문제 설명도 길지 않고, 스토리텔링이 더해지지 않아서 이해하기 쉬운 착한(?) 문제 였습니다.

 

처음에는

자연수 n을 이진수 변환을 한 다음 — 해당 ⓐ 이진수가 갖고 있는 1의 갯수를 맞추면서 조각조각 따따따(비트 연산) 한 뒤 — 얘를 다시 10진수로 변환해서 반환해주기 —

를 상상했습니다만..

 

그러한 결과를 낼 수 있는 규칙성을 찾기 어려워서, 다른 방법을 시도했습니다.

 

n을 1씩 증가 시키면서, n+1이 조건에 맞는지(즉, ⓑ n + 1 이진수 변환 시 1의 갯수가 ⓐ와 같은지) 따져보고,

맞으면 걔가 정답!!

이라는 방법이었습니다.

 

첫 번째 시도 (오답, 90/100)

code

function solution(n) {
    let binaryArr = toBinaryArr(n);
    let countNumber1 = binaryArr.filter(v => v === 1).length;
    let targetNumber = n + 1;
    let targetCountNumber1 = 0;
    
    while (countNumber1 !== targetCountNumber1) {
        targetCountNumber1 = toBinaryArr(targetNumber).filter(v => v === 1).length;
        targetNumber++;
    }
    
    return --targetNumber;
}

function toBinaryArr(n) {
    let result = [];
    
    while (n > 0) {
        const remain = n % 2;
        result = [remain, ...result];
        n = Math.floor(n / 2);
    }
    
    return result;
}

review

function toBinaryArr(n) {
    let result = [];
    
    while (n > 0) {
        const remain = n % 2;
        result = [remain, ...result];
        n = Math.floor(n / 2);
    }
    
    return result;
}

저는 먼저, 이진수 구하는 로직을 직접 작성해 보았는데요..

(사실 '두 번째 시도'에서 시도했던 방법이 떠오르지 않았음..^^)

그 결과는 바로

 

 

장렬히 실패

 

두 번째 시도 (정답)

code

function solution(n) {
    let count1 = [...n.toString(2)].filter(v => v == 1).length;
    let target = n + 1;
    let targetCount1 = 0;
    
    while (count1 !== targetCount1) {
        targetCount1 = [...target.toString(2)].filter(v => v == 1).length;
        target++;
    }
    
    return --target;
}

review

n.toString(2)

JavaScript에는 toString() 이라는 아름다운 메서드가 있었죠..

 

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Object/toString
 

Object.prototype.toString() - JavaScript | MDN

Object 객체의 메서드인 toString() 은 해당 object를 표현하는 문자열을 반환합니다. 이 메서드는 사용자가 타입 강제 변환을 통해 파생된 객체에서 재정의할 수 있습니다.

developer.mozilla.org

 

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Number/toString
 

Number.prototype.toString() - JavaScript | MDN

toString() 메서드는 특정한 Number 객체를 나타내는 문자열을 반환합니다.

developer.mozilla.org

유용한 메서드 입니다.

 

소감

첫 번째 시도 (오답, 90/100) 두 번째 시도 (정답)

그 결과, 이렇게 통과할 수 있었습니다.

 

수제 작성 이진수 변환 함수보다 성능이 훨 좋습니다.

 

어려운 문제는 아니었지만,

toString()의 아름다움과 소중함을 다시금 상기하는 시간이었습니다.

 

'공부 > 코딩테스트' 카테고리의 다른 글

[프로그래머스/js] 124 나라의 숫자 (Lv. 2)  (2) 2025.04.08
[프로그래머스/js] 숫자의 표현 (Lv. 2)  (2) 2025.03.26
[프로그래머스/js] 비밀 코드 해독 (Lv. 2)  (2) 2025.03.17
[프로그래머스/js] 가장 가까운 같은 글자 (Lv. 1)  (7) 2025.01.22
[프로그래머스/js] 배열 만들기 2 (Lv. 0)  (7) 2025.01.16
'공부/코딩테스트' 카테고리의 다른 글
  • [프로그래머스/js] 124 나라의 숫자 (Lv. 2)
  • [프로그래머스/js] 숫자의 표현 (Lv. 2)
  • [프로그래머스/js] 비밀 코드 해독 (Lv. 2)
  • [프로그래머스/js] 가장 가까운 같은 글자 (Lv. 1)
ywwwon01
ywwwon01
이것저것 작성합니다.. 어엿한 웹 개발자로의 길
  • ywwwon01
    ywwwon01 님의 블로그
    ywwwon01
  • 전체
    오늘
    어제
    • 분류 전체보기 (33)
      • 낙서장 (3)
      • 공부 (20)
        • 코딩테스트 (13)
        • IT 인프라 (7)
      • 개발 (9)
        • Front-End (7)
        • Back-End (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Heap
    에러 노트
    Queue
    splice
    최적화
    WSL2
    EC2
    ubuntu
    toString()
    docker
    falsy
    VPC
    배포
    파일시스템
    AWS 프리티어
    EBS
    two-pointers
    델타 탐색
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
ywwwon01
[프로그래머스/js] 다음 큰 숫자 (Lv. 2)
상단으로

티스토리툴바