조건
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))
총평
🔍 코드 분석:
✅ 정말 좋았던 점들:
- 브루트포스 접근 - 확실하고 이해하기 쉬워
- 변수명 - one, plus, one_plus 직관적
- 로직 - 단계별로 명확
🔧 개선할 수 있는 부분들:
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
'프로그래밍 > 코딩테스트' 카테고리의 다른 글
| 프로그래머스 코딩테스트 L2: 피보나치 수 (❌틀림) (4) | 2025.08.23 |
|---|---|
| 프로그래머스 코딩테스트 L2: 짝지어 제거하기 (0) | 2025.08.23 |
| 프로그래머스L2: JadenCase 문자열 만들기 (0) | 2025.08.23 |
| 프로그래머스 L2: 최솟값 만들기 (0) | 2025.08.23 |
| 프로그래머스 L2: 올바른 괄호 (0) | 2025.08.23 |