TIL 64 | 자바스크립트로 알고리즘 (프로그래머스 다음 큰 숫자 JS)

Gom·2021년 4월 26일
0

Algorithm

목록 보기
33/48
post-thumbnail

문제 바로가기

문제 요약

조건 1. n의 다음 큰 숫자는 n보다 큰 자연수 입니다.
조건 2. n의 다음 큰 숫자와 n은 2진수로 변환했을 때 1의 갯수가 같습니다.
조건 3. n의 다음 큰 숫자는 조건 1, 2를 만족하는 수 중 가장 작은 수 입니다.
예를 들어서 78(1001110)의 다음 큰 숫자는 83(1010011)입니다.

자연수 n이 매개변수로 주어질 때, n의 다음 큰 숫자를 return 하는 solution 함수를 완성

접근 방법

1차 시도 ) 규칙을 찾으려 했다. 1의 갯수가 동일한 채로 더 큰 수가 되기 위해서는 두번째 자리에 오는 1의 위치가 좌로 이동해야 하고 1,2번째로 오는 1을 제외한 나머지 1이 우측부터 차례대로 자리를 채우면 조건 3을 만족한다고 추측했다. 만약 모두 1로 이루어진 이진수였을 경우 1,2번째 '1' 사이에 0이 추가된만큼 수가 증가할 것이라는 식을 세워 코드를 작성했다. 그 결과 문제에 제시된 예시만 통과하고 정확성 테스트에서 오답이 나왔다.

2차 시도 ) 브루트포스 방식으로 풀이했다. 처음 주어진 이진수 n의 1의 개수와 동일한 수가 나올 때까지 n을 하나씩 증가시켜 이진수로 변환한 뒤 비교했다.

사용 문법

  • 특정 문자(열) 찾아내기 : .match(정규표현식)을 이용
  • 특정 문자(열)의 개수 세기 : .match(정규표현식).length
  • 이진수<>10진수간 변환 : target.toString(2), parseInt(target,2)
    참고자료 : 진수 변환 방법

정답 코드

function solution(n) {
    let count = 0;
    count = binCount(n);
    while(1){
        if(binCount(++n) === count){
            return n;
        }
    }
    return answer;
}
function binCount(num){
    const bin = num.toString(2)
    let countOne = bin.match(/1/gi).length;
    return countOne;
}
profile
안 되는 이유보다 가능한 방법을 찾을래요

0개의 댓글