문제
9자리 이하의 음이 아닌 정수 N이 있다. 당신은 이 수에서 한 쌍의 숫자를 골라 그 위치를 바꾸는 일을 최대 한 번 하여(안 하거나, 한 번만 하여) 새로운 수 M을 만들 수 있다. 단, 바꾼 결과 M의 맨 앞에 ‘0’이 나타나면 안 된다.
M의 최솟값과 최댓값을 구하는 프로그램을 작성하라.
[입력]
첫 번째 줄에 테스트 케이스의 수 T가 주어진다.
각 테스트 케이스는 하나의 줄로 이루어진다. 각 줄에는 0 이상 999,999,999 이하의 정수 N이 주어진다. N ≠ 0 이라면 주어지는 수가 0으로 시작하지 않는다.
[출력]
각 테스트 케이스마다, M의 최솟값과 최댓값을 공백 하나를 사이로 두고 출력한다.
문제 풀이
두 요소끼리 자리를 바꾸는 경우의 수를 구하고, 각각의 경우의 수대로 자리를 바꾼 결과값의 크기를 비교해가며 min, max를 구하면 될 것이다.
경우의 수가 (1,2) 이든 (2,1)이든 1번 인덱스와 2번 인덱스 값을 바꾸는 것이므로 (1,2) 하나의 경우의 수만 있으면 된다. 즉, 순서는 중요하지 않으므로 순열이 아닌 조합을 구한다.
또한 0 은 맨 앞자리에 올 수 없다는 조건을 추가해준다. 경우의 수대로 자리를 바꾸고 나서 문자 리스트의 첫 번째 요소가 0이 되는 경우, 해당 경우의 수에는 자리 바꾸기를 취소하고 문자를 원위치시킨다.
작성 코드
from itertools import combinations
import sys
sys.stdin = open("input.txt", "r")
T = int(input())
for test_case in range(1, T+1):
N = list(x for x in input()) # 입력받은 문자열을 문자리스트로 변환
target = [i for i in range(len(N))] # 바꿀 문자의 인덱스를 추출하기 위한 리스트
min_num, max_num = int(''.join(N)), int(''.join(N))
for value in combinations(target, 2): # 순서는 중요하지 않으므로 permutations(순열) 대신 combinations(조합)
i, j = value
N[i], N[j] = N[j], N[i]
if N[0] == '0':
N[i], N[j] = N[j], N[i]
continue
if int(''.join(N)) < min_num:
min_num = int(''.join(N))
if int(''.join(N)) > max_num:
max_num = int(''.join(N))
N[i], N[j] = N[j], N[i]
print(f'#{test_case} {min_num} {max_num}')
알게된 점
: 파이썬의 itertools
1. combinations (조합)
- 순서 고려 X
- 요소의 값이 아니라 위치로 고유성을 다룸
itertools.combinations(iterable, r)
# 입력 iterable에서 요소의 길이 r 서브 시퀀스들을 반환
예)
li = ['a','b','c','d']
result = list(combinations(li, 2))
print(result)
## 출력 결과 ##
[('a', 'b'), ('a', 'c'), ('a', 'd'), ('b', 'c'), ('b', 'd'), ('c', 'd')]
2. permutations (순열)
- 순서 고려 O
- 요소의 값이 아니라 위치로 고유성을 다룸
itertools.permutations(iterable, r=None)
# iterable에서 요소의 연속된 길이 r 순열을 반환
# r이 지정되지 않았거나 None이면, r의 기본값은 iterable의 길이이며 가능한 모든 최대 길이 순열이 생성
예)
li = ['a','b','c','d']
result = list(permutations(li, 2))
print(result)
## 출력 결과 ##
[('a', 'b'), ('a', 'c'), ('a', 'd'), ('b', 'a'), ('b', 'c'), ('b', 'd'), ('c', 'a'), ('c', 'b'), ('c', 'd'), ('d', 'a'), ('d', 'b'), ('d', 'c')]
그 외의 itertools 모듈에 내장된 함수 더보기
'Problem Solving' 카테고리의 다른 글
[백준] 18258 - 큐2 in 파이썬 (0) | 2022.05.29 |
---|---|
[SWEA] D2 - 1974. 스도쿠 검증 in 파이썬 (0) | 2022.05.27 |
[SWEA] D3 - 14178. 1차원 정원 in 파이썬 (0) | 2022.05.23 |
[SWEA] D3 - 13547. 팔씨름 in 파이썬 (0) | 2022.05.22 |
[SWEA] D3 - 13229. 일요일 in 파이썬 (0) | 2022.05.22 |