[프로그래머스] 레벨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를 사용하는게 시간 절약에 도움이 된다고 느꼈다. 코딩 테스트에는 필연적으로 제한 시간이 있고, 미리 구현된 내부 라이브러리를 쓸 수 있다면 알아두고 연습해 두는게 고득점을 맞을 수 있다고 느꼈다.