ps
[백준] 1039 교환 (골드 3)
scofee
2023. 3. 2. 23:51
from collections import deque
import sys
input = sys.stdin.readline
N, K = map(int, input().rstrip().split())
size = len(str(N))
queue = deque()
queue.append((str(N), 0))
visited = set()
answer = 0
while queue:
now, cnt = queue.popleft()
## K번이 지났다면 최댓값 갱신해준다.
if cnt == K:
answer = max(answer, int(now))
continue
for i in range(size - 1):
for j in range(i+1, size):
## 교환 불가한 상황은 무시하기
if i == 0 and now[j] == "0":
continue
now = list(now)
now[i], now[j] = now[j], now[i]
## 방문하지 않은 배치라면 cnt를 1 증가시킨 후 queue에 넣어준다.
if ("".join(now), cnt + 1) not in visited:
queue.append(("".join(now), cnt+1))
visited.add(("".join(now), cnt+1))
now[i], now[j] = now[j], now[i]
print(answer if answer > 0 else -1)
처음에 그리디로 접근했는데 시간초과가 났다.
for문으로 기준 수를 정하고, 그 수 오른쪽의 수 중 가장 큰 수와 교체하는 아이디어였다. (왜 시간초과가 뜨는 지 잘 모르겠음.)
그래서 bfs 방식으로 돌렸더니 AC를 받았다