TIL/프로그래머스

[프로그래머스 level2 다음 큰 숫자] bin을 활용하면 2진수가 손쉽게 나온다구?

곰퓨타 2021. 1. 3. 13:56

이번 문제는 프로그래머스 level1 비밀지도에서 bin을 활용하였던 방법을 응용하여 적은 시간 내에 해결할 수 있었다.

저번에 bin의 사용에 대해 정리하지 않은 것 같아 , 이 문제를 통해 정리해보고자 한다.

 

오늘 해결해야하는 문제는 다음과 같았다.

programmers.co.kr/learn/courses/30/lessons/12911

 

코딩테스트 연습 - 다음 큰 숫자

자연수 n이 주어졌을 때, n의 다음 큰 숫자는 다음과 같이 정의 합니다. 조건 1. n의 다음 큰 숫자는 n보다 큰 자연수 입니다. 조건 2. n의 다음 큰 숫자와 n은 2진수로 변환했을 때 1의 갯수가 같습니

programmers.co.kr

 

 

 

[문제 설명]

자연수 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

 

 

 

이 문제를 보고 주어진 숫자를 bin을 통해 2진수로 바꾼 후, 주어진 숫자 다음 숫자부터 2진수로 바꾸며 1의 개수가 같은 경우 반복문을 중단하고 리턴해주도록 코드를 구성하였다.

 

이러한 아이디어를 바탕으로 작성한 코드는 다음과 같다.

 

def solution(n):
    bin_n = bin(n)[2:]
    n_one_count = bin_n.count('1')
    big_n = n+1
    while True :
        bin_bigN = bin(big_n)[2:]
        bigN_one_count = bin_bigN.count('1')
        if n_one_count == bigN_one_count :
            break
        big_n += 1
    return big_n

 

(여기서 1의 개수를 세는 것이므로 bin(n)[2:]를 통한 슬라이싱이 필수적이지는 않다..!)

10진수를 2진수로 변환하고 2진수를 10진수로 쉽게 변환하는 방법에 대해 설명하고자 다음과 같이 작성하였다.

 

bin()함수는 10진수를 2진수로 변환하는 함수이고 int는 문자열을 정수로 바꾸어주는 함수이다.

int에서 base를 설정하면 현재 문자열이 base진수이니 이를 10진수로 바꾸어 출력해준다.

이를 활용한 예시는 다음과 같다.

 

n=11
bin_n = bin(n)
dec_n = int(bin_n,base=2)
print("n : %d,  2진수 n : %s,   10진수 n : %d" %(n,bin_n, dec_n))

#n : 11,  2진수 n : 0b1011,   10진수 n : 11

 

bin을 활용해 2진수로 바꾸게 되면 '0b1011'의 문자열로, 앞에 0b를 통해 진수 표시를 해주기 때문에 2진수 숫자만을 활용하는 경우가 필요하게 되면 bin(n)[2:]를 통해 숫자만 사용할 수 있게 된다 ❗️

 

진수 변환 시 항상 예전 코드를 확인하는 습관이 있었으므로 이에 대해 한번 확실히 짚고 넘어가보고자 정리를 하였다.

오늘 내장 함수를 통한 진수 변환이 아닌 , 어떠한 진수도 변환이 가능하도록 하는함수를 만들어서 정리해보아야 겠다 ⭐️