12911 - 다음 큰 숫자

김현주·2021년 1월 3일
0

프로그래머스

목록 보기
32/36
post-thumbnail

😄 문제 설명

Description
자연수 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 이하의 자연수 입니다.


입출력 예

nresult
7883
1523

입출력 예 설명
입출력 예#1
문제 예시와 같습니다.

입출력 예#2
15(1111)의 다음 큰 숫자는 23(10111)입니다.

출처 https://programmers.co.kr/learn/courses/30/lessons/12911

💻 Javascript 코드

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;
}

💻 Python 코드

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한다.
  • n에서부터 1을 더해가며 count_num_of_one()함수를 통해 1의 개수를 센다.
  • 1의 개수가 같다면 while문을 빠져나온다.

처음에는 문제를 보고 바뀐 이진수에서 1의 개수가 같으면서 그 중에서 제일 작은 수를 구하는 방법을 구현하려 했으나, 이를 구현하기 위한 아이디어가 딱히 떠오리지 않아서 위와 같은 방법으로 해결하였다.

profile
우당탕탕 주니어 프론트엔드 개발자입니다

0개의 댓글