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 | 31 |
Tags
- Flutter
- ML
- fastapi를 사용한 파이썬 웹 개발
- Algorithm
- FastAPI
- BAEKJOON
- ARM
- 파이토치 트랜스포머를 활용한 자연어 처리와 컴퓨터비전 심층학습
- pytorch
- rao
- MDP
- 영상처리
- Image Processing
- BOF
- Widget
- C++
- Kaggle
- Stream
- Computer Architecture
- 백준
- MATLAB
- system hacking
- DART
- bloc
- PCA
- BFS
- Dreamhack
- study book
- Got
- llm을 활용 단어장 앱 개발일지
Archives
- Today
- Total
Bull
[백준] 2292: 크면서 작은 수(python) 본문
https://www.acmicpc.net/problem/2992
문제
정수 X가 주어졌을 때, X와 구성이 같으면서 X보다 큰 수 중 가장 작은 수를 출력한다.
수의 구성이 같다는 말은, 수를 이루고 있는 각 자리수가 같다는 뜻이다. 예를 들어, 123과 321은 수의 구성이 같다. 하지만, 123과 432는 구성이 같지 않다.
입력
첫째 줄에 X가 주어진다. (1 ≤ X ≤ 999999) X는 0으로 시작하지 않는다.
출력
첫째 줄에 결과를 출력한다. 만약 그러한 숫자가 없는 경우에는 0을 출력한다.
def next_greater_number(X):
# string을 각 자리수 리스트로 변환
digits = list(str(X))
n = len(digits)
i = n - 2
# 반전 구간 찾기 (혹은 증가 부분, 오른쪽부터 읽어야함(최초))
while i >= 0 and digits[i] >= digits[i + 1]:
i -= 1
# digit[i] = 5, i = 1
# print("i",digits[i])
if i == -1:
return 0
# 하강 구간에서 반전구간의 시작점보다 낮아지는 부분 (오른쪽부터 읽어야함(최초))
j = n - 1
while digits[j] <= digits[i]:
j -= 1
# digit[j] = 6, j = 2
# print("j",digits[j])
# 서로 위치를 바꿔줌
# 5 <-> 6
# 156 -> 165
digits[i], digits[j] = digits[j], digits[i]
# print("swap",digits)
# [::-1] 역순 -> 16 + 5(reverse)
digits = digits[:i + 1] + digits[i + 1:][::-1]
# print("digits[:i + 1]",digits[:i + 1])
# print("digits[i + 1:][::-1]",digits[i + 1:][::-1])
# print("reverse",digits)
return int(''.join(digits))
X = int(input())
result = next_greater_number(X)
print(result)