😈 다음 큰 숫자
📗 문제 설명
자연수 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 |
💬입출력 예 설명
입출력 예 설명 #1
- 문제 예시와 같습니다.
입출력 예 설명 #2
- 15(1111)의 다음 큰 숫자는 23(10111)입니다.
💎나의 풀이
문제에 조건을 분석해보자.
우선 1차적으로 n보다 큰수,
n의 2진수 값의 1의 개수와 같은 값에 n과 가장 가까운 값이다.
조건을 달성 시에 값을 배출 하면 되기 떄문에 for문 보다는 while문이 적합하다.
const solution = n => {
let i = n+1
while([...n.toString(2)].filter(v=>v==="1").length !==[...i.toString(2)].filter(v=>v==="1").length){
i++
}
return i
}
toString(2)는 10진수를 2진수로 바꾸어 준다. 대신 string 타입으로 바뀐당 이점 유의 하시길 바란다.
바꿔준 n의 2진수 값들에서 "1"만 필터링 해주고 그 길이를 i와 비교해준다.
i는 n보다 큰 수이기 떄문에 +1로 시작해주고, 마찬가지로 필터링 해주자.
둘이 값이 같지 않으면 i를 +1 시켜주고 i가 같아지면 반복문은 중단 될 것이다.
코드가 지저분하니 공부중인 재귀함수를 사용하여 추상화 시켜주자.
const solution = n => {
const count = num => [...num.toString(2)].filter(v=>v==="1").length;
let i = n+1
while(count(i) !== count(n)){
i++
}
return i
}
count 함수를 작성 해주고 num 값에 i 와 n 이 들어가주면 된다.
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
[프로그래머스 😈] JavaScript 이중우선순위큐 (0) | 2024.09.04 |
---|---|
[프로그래머스 😈] JavaScript 짝지어 제거하기 (0) | 2023.11.24 |
[프로그래머스 😈] JavaScript 크기가 작은 부분 문자열 (0) | 2023.11.24 |
[프로그래머스 😈] JavaScript 피보나치 수 (0) | 2023.11.24 |
[프로그래머스 😈] JavaScript 약수의 개수와 덧셈 (1) | 2023.11.22 |