1039.교환
2024. 5. 19. 15:22ㆍProgrammers
728x90
테스트 코드는 모두 통과했으나 , 반례를 못찾아서 풀지 못한 문제다..
# 무조건 k번 수행해야 함
# input : n, k / output : k번 바꾸어 나올 수 있는 최댓값
n, k = input().split()
number = list(n)
k = int(k)
# 자릿수가 1자리이거나, 뒷자리에 0만 포함되어 있을 시
if len(number) == 1 or set(number) == {number[0], '0'}:
result = -1
print(result)
else:
idx = 0
# 1~i 내림차순 진행
# i~k 내림차순으로 정렬되어 있을 경우, 남은 횟수(k-i)만큼 가장 작은 두 수끼리 교환
while (idx < len(number)-1) and (k > 0):
max_idx = idx
max_num = number[idx]
for j in range(idx+1, len(number)):
# 최댓값 찾기
if number[j] >= max_num:
max_num = number[j]
max_idx = j
if max_idx == idx:
if idx < len(number) - 1:
idx += 1
else:
# 최댓값과 자리 바꾸기
number[idx], number[max_idx] = number[max_idx] , number[idx]
k -= 1
idx += 1
if k > 0 and k%2 == 1:
number[-1], number[-2] = number[-2], number[-1]
result = int(''.join(number))
print(result)
무조건 내림차순으로 정렬해야 하는것이 아니라, k번 내로 어떤 경로로든 자리 간 변경을 하면서 k번 변경했을 시 나올 수 있는 최댓값을 구해야 하는 문제이므로 이 접근법은 잘못되었다.
# 교환
from collections import deque
N, K = map(int, input().split())
M = len(str(N))
def bfs(N, K):
visited = set()
visited.add((N, 0))
q = deque()
q.append((N, 0))
answer = 0
while q:
n, k = q.popleft()
if k == K:
answer = max(answer, n)
continue
n = list(str(n))
for i in range(M-1):
for j in range(i+1, M):
if i == 0 and n[j] == '0':
continue
n[i], n[j] = n[j], n[i]
nn = int(''.join(n))
if (nn, k+1) not in visited:
q.append((nn, k+1))
visited.add((nn, k+1))
n[i], n[j] = n[j], n[i]
return answer if answer else -1
print(bfs(N, K))
k번 변경했을 때의 모든 경우의 수를 BFS 방법으로 접근하여, k == K 일 때 최댓값을 갖는 Answer를 출력하는 코드이다.
728x90
'Programmers' 카테고리의 다른 글
14503. 로봇 청소기 (0) | 2024.04.21 |
---|---|
9205.맥주 마시면서 걸어가기 (0) | 2024.04.20 |
2468. 안전영역 (0) | 2024.04.18 |
[2644]촌수 계산 (0) | 2024.04.10 |
[SQL] 노선별 평균 역 사이 거리 조회하기 (0) | 2024.03.10 |