[Python] 숫자 조작 (SWEA D3 13428번 파이썬)
https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AX4EJPs68IkDFARe
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
9자리 이하의 음이 아닌 정수 N이 있다. 당신은 이 수에서 한 쌍의 숫자를 골라 그 위치를 바꾸는 일을 최대 한 번 하여(안 하거나, 한 번만 하여) 새로운 수 M을 만들 수 있다. 단, 바꾼 결과 M의 맨 앞에 ‘0’이 나타나면 안 된다.
M의 최솟값과 최댓값을 구하는 프로그램을 작성하라.
[입력]
첫 번째 줄에 테스트 케이스의 수 T가 주어진다.
각 테스트 케이스는 하나의 줄로 이루어진다. 각 줄에는 0 이상 999,999,999 이하의 정수 N이 주어진다. N ≠ 0 이라면 주어지는 수가 0으로 시작하지 않는다.
[출력]
각 테스트 케이스마다, M의 최솟값과 최댓값을 공백 하나를 사이로 두고 출력한다.
입력 조건이 10억 미민의 정수인 것을 보고, 완전탐색을 제외한 다른 알고리즘을 생각해보았으나 해결하지 못했습니다.
결국 완전탐색을 이용했고, 두 숫자만 비교하면 되므로 for반복문 두 개를 이용해 겹치지 않도록 비교했습니다.
선택한 두 개의 숫자를 버블정렬 과정처럼 tmp변수를 통해 스왑하면서, 바뀐 숫자를 점검합니다.
최댓값 최솟값을 각각 무한대, 0으로 설정하지 않는 이유는 10000이 들어왔을 때는 첫번째 조건문에서 걸러져 입력된 값이 그대로 출력버리기 때문입니다.
최댓값/최솟값이라면 갱신하는데, 이때 앞자리가 0인 경우는 제외해야 합니다.
코드
T = int(input())
for t in range(1,T+1):
n = input()
if n=='0':
print(f"#{t} 0 0")
continue
#join 사용을 위한 문자열로 병합 후 정수로 변환
max_value = int(n)
min_value = int(n)
# 입력이 10000 이런 경우 어떻게 스왑을 하든 맨앞에 0이 오게됨
# -> 10000은 최댓값과 최솟값이 같다.
leng = len(list(n))
for i in range(leng-1):
for j in range(i+1, leng):
new_n = list(n)
tmp = new_n[i]
new_n[i] = new_n[j]
new_n[j] = tmp
if new_n[0] == '0':
continue
chng_n = int(''.join(new_n))
if chng_n > max_value:
max_value = chng_n
if chng_n < min_value:
min_value = chng_n
print(f"#{t} {min_value} {max_value}")