[SWEA] 최대 상금
Date:
[SWEA] 최대 상금
Problem URL : 최대 상금
import sys
sys.stdin = open("input.txt", "r")
T = int(input())
def dfs(idx, end, cnt):
global ans, repeated
if cnt == 0:
n = int("".join(N))
if ans < n:
ans = n
return
if idx == end:
if not repeated and cnt % 2 == 1: # 전체 자리수를 다 순회했음에도 교환 횟수가 남았고
N[-2], N[-1] = N[-1], N[-2] # 중복되는 수가 없고, 남은 교환횟수가 홀수일 때
n = int("".join(N)) # 어쩔 수 없이 마지막 2개의 수를 교환
if ans < n:
ans = n
return
max_num = "-1"
max_list = []
for i in range(idx, end):
if max_num < N[i]:
max_num = N[i]
max_list = [i]
elif max_num == N[i]:
max_list.append(i) # 최댓값이 현재 idx위치의 숫자카드랑 교환될 후보들이다.
for i in max_list:
if i == idx:
dfs(idx + 1, end, cnt)
continue
N[idx], N[i] = N[i], N[idx]
dfs(idx + 1, end, cnt - 1)
N[idx], N[i] = N[i], N[idx] # 백트래킹
for tc in range(1, T + 1):
N, E = input().split()
N, E, L = list(N), int(E), len(N)
ans = 0
repeated = False
numbers = [0] * 10
for i in N:
numbers[int(i)] += 1
for i in range(10):
if numbers[i] > 1: # 중복 체크
repeated = True
break
dfs(0, L, E)
print("#{} {}".format(tc, ans))
Comments
자잘한 실수를 해서 생각보다 시간이 좀 걸렸다.
매턴 교환해야할 후보들이 최댓값인 숫자 카드들 전부인 것을 주의해야 한다.
댓글