📌 문제
자연수 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진법으로 변환 : num.toString(n)
- 기존 배열에서 조건에 맞는 요소들만 새로운 배열로 반환 : array.filter
- 배열이나 문자열처럼 반복 가능한 (이터러블) 객체를 전개해 각 요소를 새로운 배열로 반환 : [...]
구할 것
- 주어진 수 n을 2진법으로 변환했을 때 1의 개수
- i = n+1, i <= 1000000, i++ 로 조건문을 돌린 수가 2진법으로 변환했을 때 1의 개수
JS에서는 n진수로 변환할 때 toString(n)을 사용한다.
n진수로 변환한 것을 10진수로 변환할 때에는 parseInt(변환할 수, n)를 사용하면 된다.
변수 n2에 toString(2)를 할당해 2진수로 변환 시킨 후, 1의 개수를 카운트 하기 위해 filter를 사용한다.
filter는 조건을 통과하는 요소들로 새로운 배열을 반환하는 메서드로, 사용하기 위해서 변수 n2가 배열이 되어야 한다.
문자열 -> 배열로 바꾸는 방법 중에 전개 구문을 사용한다.
전개 구문은 문자열이나 배열처럼 반복 가능한 객체를 펼쳐서 하나씩 각 요소를 새로운 배열로 반환하는 문법이다.
쓰는 건 매우 간단하여 앞에 ...을 붙이면 된다.
n = 5라고 할 때, let n2 = n.toString(5) 라고 하면 n2는 101이라는 문자열로 반환된다.
이것을 [...n2]라고 써주면 ['1', '0', '1'] 이라고 반환되고, filter로 1의 개수를 구해야 하니 1인 것의 길이를 반환한다.
이렇게 하면 주어진 숫자의 2진수로 변환했을 때 1의 갯수를 구할 수 있게 되었다.
다음으로 주어진 숫자보다 큰 숫자여야 하기 때문에, for문을 돌릴 때 i는 n+1로 할당한다.
제한 사항에서 n은 1,000,000 이하의 자연수라고 했기 때문에 범위도 동일하게 하여 1씩 증가한다고 하자.
새로운 변수 i2는 i를 2진수로 변환하고, 위에서 구한 것처럼 동일하게 1의 개수를 구한다.
이 때 만약 두 수의 1의 개수가 같을 경우, 그 수가 n 다음 큰 숫자이므로 i를 반환한다.
function solution(n) {
let n2 = n.toString(2);
let n2length = [...n2].filter((v) => v === "1").length;
for (let i = n + 1; i <= 1000000; i++) {
let i2 = i.toString(2);
let i2length = [...i2].filter((v) => v === "1").length;
if (n2length === i2length) {
return i;
}
}
}
'⚙️ 코딩테스트' 카테고리의 다른 글
[JavaScript] 프로그래머스 코딩테스트 레벨 1 : 완주하지 못한 선수 (0) | 2023.05.30 |
---|---|
[JavaScript] 프로그래머스 코딩테스트 레벨 1 : 폰켓몬 (0) | 2023.05.29 |
[JavaScript] 프로그래머스 코딩테스트 레벨 2 : 짝지어 제거하기 (0) | 2023.05.25 |
[JavaScript] 프로그래머스 코딩테스트 레벨 1 : 명예의 전당(1) (0) | 2023.05.24 |
[JavaScript] 프로그래머스 코딩테스트 레벨 1 : 푸드 파이트 대회 (0) | 2023.05.09 |