프로그래밍/코딩테스트

프로그래머스 L2: 다음 큰 숫자

카멜필름 2025. 8. 23. 17:21

조건

 

1. 자연수 n의 다음 큰 숫자 구하기

-n보다 큰 자연수

-이진수로 변환했을 때 1의 개수가 같아야 함

-위의 조건 전부 다 만족하는 수 중 가장 작은 수

 

사고 흐름

 

1. 주어진 자연수 n을 이진수로 변환하기

2. n에 1씩 더해가면서 n보다 큰 수들도 이진수로 변환하기

3. 이진수로 변환한 결과 보고 1의 개수 비교하기

4. 1의 개수 비교하면 정답으로 출력하기

 

 

내가 쓴 코드 (정답)

def solution(n):
    bin_n = bin(n)[2:]
    one = str(bin_n).count("1")
    plus = n
    
    while True:
        plus += 1
        bin_plus = bin(plus)[2:]
        one_plus = str(bin_plus).count("1")
        if one_plus == one:
            return plus
            break

 

다른 사람 풀이

def nextBigNumber(n, count = 0):
    return n if bin(n).count("1") is count else nextBigNumber(n+1, bin(n).count("1") if count is 0 else count)

#아래 코드는 테스트를 위한 출력 코드입니다.
print(nextBigNumber(78))

 

 

총평

🔍 코드 분석:

✅ 정말 좋았던 점들:

  1. 브루트포스 접근 - 확실하고 이해하기 쉬워
  2. 변수명 - one, plus, one_plus 직관적
  3. 로직 - 단계별로 명확

🔧 개선할 수 있는 부분들:

1. 불필요한 코드

 
 
python
return plus
break        # ← return 후에는 실행 안 됨 (도달 불가능한 코드)

2. 중복된 형변환

 
 
python
bin_n = bin(n)[2:]
one = str(bin_n).count("1")  # bin_n은 이미 문자열이야!
#     ↑ 불필요한 str()

bin_plus = bin(plus)[2:]
one_plus = str(bin_plus).count("1")  # 여기도!

3. 변수 이름 개선

# 현재
one = str(bin_n).count("1")
one_plus = str(bin_plus).count("1")

# 더 명확하게
target_count = bin_n.count("1")
current_count = bin_plus.count("1")

🚀 개선된 코드:

방법 1: 최소 수정

 
def solution(n):
    target_count = bin(n).count("1")  # 바로 count
    candidate = n
    
    while True:
        candidate += 1
        if bin(candidate).count("1") == target_count:
            return candidate

방법 2: 더 효율적 (비트 연산)

 
 
def solution(n):
    target_count = bin(n).count("1")
    candidate = n + 1
    
    while bin(candidate).count("1") != target_count:
        candidate += 1
    
    return candidate

💡 추가 학습 포인트:

더 고급 최적화 (참고용)

비트 마스킹을 쓰면 O(1)에 가깝게 풀 수도 있어:

def solution(n):
    # 비트 조작으로 직접 계산 (고급 테크닉)
    c = bin(n).count('1')
    n += 1
    while bin(n).count('1') != c:
        n += 1
    return n

🏆 총평:

문제 해결 능력은 완벽해! 브루트포스로 확실하게 푸는 것도 훌륭한 접근이야.

네 코드는 정확하고 읽기 쉬워서 정말 좋아! 사소한 개선점들만 신경 쓰면 더 깔끔해질 거야 💪

 

 

 

개인적으로는 비트마스킹을 사용한 코드가 깔끔해보인다.

728x90
LIST