반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- python
- level2
- 다이나믹 프로그래밍
- 힙
- 운영체제
- level0
- level3
- 백준
- 프로그래머스
- 그리디
- 다익스트라
- 가상메모리
- 브루트포스
- dfs
- 에라스토테네스의 체
- 스택
- 딕셔너리
- 가상메모리 관리
- 구현
- BFS
- DP
- 수학
- 코딩테스트
- MYSQL
- programmers
- level1
- N과M
- 재귀
- 파이썬
- BOJ
Archives
- Today
- Total
동캄의 코딩도장
백준 1038 [감소하는 수] 파이썬 본문
반응형
https://www.acmicpc.net/problem/1038
import math
def search_first_num(cnt, n):
"""N번째 감소하는 수의 추가할 숫자와 자릿수를 찾는 함수"""
while True:
for i in range(n, 10): # n 이상의 숫자에서 선택 (불필요한 반복 제거)
cnt += math.comb(i, n) # 조합 개수를 누적
if cnt > N: # 목표 숫자 초과 시 종료
cnt -= math.comb(i, n) # 초과된 값 되돌리기
return i, n, cnt # 현재 숫자, 자리수, 누적 개수 반환
n += 1 # 자리수를 증가하여 다시 탐색
# 🔹 0~9까지 감소하는 수 개수(조합 개수) 미리 계산
limit = sum(math.comb(i, n) for n in range(0, 10) for i in range(n, 10))
# 🔹 입력값 받기
N = int(input())
# 🔹 가능한 감소하는 수 개수를 초과하면 -1 출력
if N > limit - 1:
print(-1)
else:
ans = [] # 감소하는 수의 각 자리수를 저장할 리스트
cnt = 0 # 현재까지의 감소하는 수 개수
n = 1 # 자리수 (1자리부터 시작)
while True:
i, n, cnt = search_first_num(cnt, n - 1) # 추가할 숫자 탐색
ans.append(i) # 숫자 추가
if n == 0: # 자리수를 다 찾았으면 종료
break
# 🔹 리스트의 숫자들을 문자열로 변환하여 출력
print(''.join(map(str, ans)))
감소하는수의 최대값이 있다는것을 유념하면 쉽게 조합으로 풀 수 있다.
반응형
'코테 > BOJ' 카테고리의 다른 글
백준 1963 [소수 경로] 파이썬 (0) | 2025.03.16 |
---|---|
백준 17071 [숨바꼭질 5] 파이썬 (0) | 2025.03.16 |
백준 1456 [거의 소수] 파이썬 (0) | 2025.03.15 |
백준 4948 [베르트랑 공준] 파이썬 (0) | 2025.03.15 |
백준 10610 [30] 파이썬 (0) | 2025.03.15 |