[백준] 1039 교환 (골드 3)

2023. 3. 2. 23:51ps

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를 받았다

'ps' 카테고리의 다른 글

[백준] 2226 이진수 (골드 4)  (0) 2023.05.14
[백준] 20187 종이접기 (골드 3)  (0) 2023.05.13
[백준] 2240 자두나무 (골드 5)  (0) 2023.03.27
[백준] 2251 물통 (골드 5)  (0) 2023.03.22
[백준] 6593 상범 빌딩 (골드 5)  (0) 2023.03.21