데이터사이언스 기록기📚

[프로그래머스/Python] Level 2_다음 큰 숫자(연습문제) 본문

Coding Test/프로그래머스(Python)

[프로그래머스/Python] Level 2_다음 큰 숫자(연습문제)

syunze 2022. 11. 4. 13:58

📌문제 유형

연습문제

 

📌문제

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

📌나의 문제풀이

def solution(n):
    answer = 0
    num_list = []
    
    # 이진수 1,0 개수 세기
    n_to_b = format(n,'b')
    n_cnt_1 = n_to_b.count('1')
    n_cnt_0 = n_to_b.count('0')
    
    # 0의 개수가 있는 경우
    if n_cnt_0:
    	# n을 하나씩 더해가면서 이진수로 바꾸기
        while n < 1000001:
            n += 1
            new_b = format(n,'b')
            new_cnt_1 = new_b.count('1')
            
            # new_cnt_1와 n_cnt_1 개수 같은 경우 리턴
            if new_cnt_1 == n_cnt_1:
                return n
    # 0의 개수가 없는 경우
    else:
        num = ['1' for _ in range(n_cnt_1)]
	# 1사이에 0 넣어보기
        for i in range(1,n_cnt_1+1):
            num.insert(i, '0')
            num_b = ''.join(num)
            num_list.append(int(num_b,2))
    # 가장 작은 수 출력    
    return min(num_list)

 

📌다른 사람의 문제풀이

 1) n을 하나씩 더한 후 1의 개수 비교

def nextBigNumber(n):
    num1 = bin(n).count('1')
    while True:
        n = n + 1
        if num1 == bin(n).count('1'):
            break
    return n

 2) 1)과 유사 풀이

def nextBigNumber(n):
    c = bin(n).count('1')
    for m in range(n+1,1000001):
        if bin(m).count('1') == c:
            return m

 

📌리뷰

- 반드시 이진수 -> 10진수가 아닌, 역으로도 생각해보기

- 이진수로 변환 : n_to_b = format(n,'b')

- 이진수 -> 10진수로 변환 : int(num_b,2)

- 이진수도 count() 함수 사용 가능

728x90
Comments