Description
자연수 n이 주어졌을 때, n의 다음 큰 숫자는 다음과 같이 정의 합니다.
예를 들어서 78(1001110)의 다음 큰 숫자는 83(1010011)입니다.
자연수 n이 매개변수로 주어질 때, n의 다음 큰 숫자를 return 하는 solution 함수를 완성해주세요.
제한 사항
n은 1,000,000 이하의 자연수 입니다.
입출력 예
n | result |
---|---|
78 | 83 |
15 | 23 |
입출력 예 설명
입출력 예#1
문제 예시와 같습니다.
입출력 예#2
15(1111)의 다음 큰 숫자는 23(10111)입니다.
출처 https://programmers.co.kr/learn/courses/30/lessons/12911
function solution(n) {
const countOne = (dec) => {
const tmp = [];
let count = 0;
if (dec === 0) {
for (let i = 0; i < n; i++) {
tmp.push(0);
}
} else {
while (dec > 1) {
tmp.unshift(dec % 2);
dec = Math.floor(dec / 2);
}
tmp.unshift(1);
}
tmp.map((item) => {
if (item === 1) {
count++;
}
});
return count;
};
const tmp = countOne(n);
var answer = 0;
for (let i = n + 1; i <= 1000000; i++) {
if (tmp === countOne(i)) {
answer = i;
break;
}
}
return answer;
}
def change_to_binary(decimal_num) : # 십진수를 이진수로 바꾸기
binary_list = []
while decimal_num > 1 :
binary_list.append(decimal_num % 2)
decimal_num = decimal_num // 2
binary_list.append(decimal_num)
return reversed(binary_list)
def count_num_of_one(n) : # 이진수에서 1의 개수 세기
count = 0
binary = change_to_binary(n)
for b in binary :
if b == 1 :
count += 1
return count
def solution(n):
answer = n + 1
num_of_one = count_num_of_one(n)
while 1 :
if count_num_of_one(answer) == num_of_one :
break
answer += 1
return answer
우아한테크코스 프리코스를 진행한 이후로 함수 분리 연습을 하고있다. 하나의 함수보다 하나의 기능을 하는 여러 함수로 코드를 구현하는게 훨씬 깔끔하고 이해하기 쉬운 것 같다. 문제 해결 방법은 다음과 같다.
change_to_binary()
함수를 통해 십진수인 n을 이진수로 바꾼다.count_num_of_one()
함수를 통해 이진수에서 1의 개수를 count한다.count_num_of_one()
함수를 통해 1의 개수를 센다.처음에는 문제를 보고 바뀐 이진수에서 1의 개수가 같으면서 그 중에서 제일 작은 수를 구하는 방법을 구현하려 했으나, 이를 구현하기 위한 아이디어가 딱히 떠오리지 않아서 위와 같은 방법으로 해결하였다.