[프로그래머스 python] 다음 큰 숫자

문제


풀이

이진수로 변환하는 방법을 알면 간단히 풀 수 있다.

전체적인 과정은 다음과 같다.

 

1. 먼저 처음 수와 그 수보다 1 큰 수를 선언한다.

2. 두 수를 이진수로 변환해서 1의 개수를 세는 함수에 입력한다.

3. 1의 개수가 일치하면 반복을 종료하고 일치하지 않으면 수를 1증가시킨다.

 

 

tmp = n + 1

처음 수는 n으로 받아오고 n보다 1 큰 수를 정의하였다.

 

def calOneNum(num1, num2):
    tranNum1 = deque()
    cntNum1 = 0
    cntNum2 = 0
    
    while num1 > 0:
        if (num1 % 2 == 1):
            cntNum1 += 1
        num1 //= 2
    
    while num2 > 0:
        if (num2 % 2 == 1):
            cntNum2 += 1
        num2 //= 2
    
    if cntNum1 == cntNum2:
        return True
    return False

두 수를 입력받아 2진수로 변환 후 1의 개수를 비교하는 함수이다.

while문을 사용하여 2진수로 변환하는데 이 때 1로 변환되면 cnt를 증가시켜준다.

 

최종적으로 두 수의 cnt값이 일치하다면 1의 개수가 동일하다는 것을 의미한다.

while True:
    if calOneNum(n, tmp):
        break
    else:
        tmp += 1
return tmp

메인함수의 반복문이다.

두 수를 입력해서 1의 개수가 일치하면 break한뒤 tmp를 return하고

아니라면 tmp에 1을 증가시켜 반복문을 계속한다.

 

 


코드

from collections import deque
def solution(n):
    answer = 0
    tmp = n + 1
    while True:
        if calOneNum(n, tmp):
            break
        else:
            tmp += 1
    return tmp


def calOneNum(num1, num2):
    tranNum1 = deque()
    cntNum1 = 0
    cntNum2 = 0
    
    while num1 > 0:
        if (num1 % 2 == 1):
            cntNum1 += 1
        num1 //= 2
    
    while num2 > 0:
        if (num2 % 2 == 1):
            cntNum2 += 1
        num2 //= 2
    
    if cntNum1 == cntNum2:
        return True
    return False

'알고리즘' 카테고리의 다른 글

[백준 kotlin] 3372 보드 점프  (0) 2024.06.17
[백준 python] 1926 그림  (0) 2024.05.30
[백준 kotlin] 1956 운동  (0) 2024.05.27
[백준 kotlin] 17609 회문  (0) 2024.05.25
[프로그래머스 kotlin] 보석 쇼핑  (0) 2024.05.19