본문 바로가기
알고리즘/프로그래머스

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

by 며루치꽃 2021. 4. 26.

1. 문제

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

 

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

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

programmers.co.kr

2. 내가 생각했던 풀이과정

 

1) 조건 1에 따라 n보다 큰 자연수이어야 하니까 n + 1로 n보다 큰 자연수를 만들어준다

2) 1의 갯수가 같아야하기 때문에 2진수로 변환해야 한다

3) 2진수로 변환해서 count( ) 함수를 통해 1의 갯수를 파악해야한다

4) n보다 큰 자연수를 + 1씩 해주면서 2진수로 변환했을 때, 1의 숫자가 같으면 가장 작은 수이기 때문에 그 순간 return을 해주면서 반복문을 빠져 나옵니다.

 

3. 나의 풀이

def solution(n):
    answer = n + 1
    while True:
        if bin(answer).count('1') == bin(n).count('1'):
            return answer
        answer += 1

 

4. 다른 사람의 풀이

def solution(n):
    binary = str(bin(n))[2:]
    if len(set(binary)) == 1 : return int('10' + binary[1:],2)
    one = binary.count('1')

    while(True):
        n += 1
        if str(bin(n))[2:].count('1') == one : return n

bin을 이용하여 2진수로 표현하면 앞에 0b가 붙기 때문에 순수한 이진수만을 가져오기위해 문자열을 slice하였다. 

 

5. 새로 알게된 점

1) bin( ) 함수

정수를 《0b》 가 앞에 붙은 이진 문자열로 변환합니다. 전달받은 integer 혹은 long integer 자료형의 값을 이진수(binary) 문자열로 돌려줍니다. 10진수를 2진수로 바꿔주는 함수로 사용하는 방법은 bin(10진수의 값) 을 하면 2진수로 출력해줍니다.

bin(3)
>> '0b11'
bin(-10)
>> '-0b1010'

앞에 0b가 붙게 되는 점이 특징이고, 조심해야할 점은 문자열로 반환해준다

16진수로 바꿔주는  hex(n) , 8진수로 바꿔주는 oct(n) 등이 있다.

혹시나 문자열로 출력되는 값을 다시 수로 바꾸고 싶다고 하면 eval ( )를 사용하면 된다.

eval("문자열")의 괄호 안에 문자열로 된 수식을 넣으면, eval ( )는 이 문자열을 수식으로 처리해서 계산한 후, 계산 값을 함수의 결과값으로 돌려준다.

 

 

2) count( )

부분문자열의 개수를 세는 메소드

 

s = "Hello Yellow" print( s.count('el') ) # 2

리스트나 문자열 등에서 사용할 수 있으며 사용 방법은 count(x) 다음과 같이 표시해  리스트나 문자열 내에 x가 몇 개 있는지  그 개수를 돌려주는 함수입니다. 

내가 찾고자 하는 값이, 리스트에 몇개나 들어있는지 확인할 수 있다.

댓글