[프로그래머스] 레벨2 (level2) 다음 큰 숫자

2020년 05월 15일, 10:00

다음 큰 숫자

문제 설명

자연수 n이 주어졌을 때, n의 다음 큰 숫자는 다음과 같이 정의 합니다.

  • 조건 1. n의 다음 큰 숫자는 n보다 큰 자연수 입니다.
  • 조건 2. n의 다음 큰 숫자와 n은 2진수로 변환했을 때 1의 갯수가 같습니다.
  • 조건 3. n의 다음 큰 숫자는 조건 1, 2를 만족하는 수 중 가장 작은 수 입니다. 예를 들어서 78(1001110)의 다음 큰 숫자는 83(1010011)입니다. 자연수 n이 매개변수로 주어질 때, n의 다음 큰 숫자를 return 하는 solution 함수를 완성해주세요.

제한사항

  • n은 1,000,000 이하의 자연수 입니다.

입출력 예

n result
78 83
15 23

처음 생각

이진수는 자주 쓰지 않는 숫자다보니 항상 처음 접하게 되면 당황하게 된다. 처음에는 이리저리 막 생각해봤다. shift를 사용해서 풀어보는 방법도 생각했지만, 컴퓨터 언어를 배우면서 shift를 거의 사용해본 적이 없어서, 이 방법도 난감했다. 그래서 그 후에 떠오른 생각은 현재 숫자+1에서부터 그냥 모든 숫자를 다 찾는 방법이였다.

문제 풀이

사실 모든 숫자를 다 비교한다고 생각하면 어렵지 않은 문제이다. For문 하나를 돌리면서 이진수로 바꾼뒤 1의 갯수를 조사하면 된다.

완성 코드

function solution(n) {
  var answer = 0;
  let binaryCount = findDup(n.toString(2));
  for (let i = n + 1; i < 10000000; i++) {
    let tempCount = findDup(i.toString(2));
    if (tempCount === binaryCount) {
      answer = i;
      break;
    }
  }

  return answer;
}

function findDup(number) {
  let count = number.match(/1/g).length;
  return count;
}

아쉬운 점 & 느낀 점

여기서, 다른 사람의 풀이를 보고 match 함수를 이용했는데, 정규식 표현에 대해서 정확한 이해가 없어서 사실 항상 match를 사용하는 것을 꺼려했는데, 이 문제를 풀면서 만약에 직접 함수를 구현하기 힘들 때가 있다면(물론 이 문제에서는 1에 대한 count만 세주면 되기 때문에 간단..), 정규식을 알고 match를 사용하는게 시간 절약에 도움이 된다고 느꼈다. 코딩 테스트에는 필연적으로 제한 시간이 있고, 미리 구현된 내부 라이브러리를 쓸 수 있다면 알아두고 연습해 두는게 고득점을 맞을 수 있다고 느꼈다.