728x90
28707. 배열 정렬
난이도 : 골드 1
소요 시간 : 20분
날짜 : 2024.12.28
언어 : 파이썬
알고리즘 유형 : 다익스트라, 그래프, 해시, 트리, 최단 경
설명 보기전에 문제 풀어보러 가기
1. 문제 설명
- 배열 A가 주어진다.
- 커맨드 l, r, c가 주어진다 : l과 r을 바꾼다. c의 비용이 든다.
- 커맨드들을 이용해서 최소비용으로 정렬하라.
2. 해결 방식
- 배열을 문자열로 저장한다.
- 배열을 목표배열까지 가는 최소경로를 구하면 된다.
- 다익스트라를 활용하여 최소비용을 구한다.
3. 정답 코드
import sys
input = sys.stdin.readline
from heapq import heappop, heappush
from collections import defaultdict
n = int(input()) # 배열 길이
A = ''
for num in map(int, input().split()):
A += str(num -1) # 배열 A를 str로 받기
goal = ''.join(sorted(A))
m = int(input())
commands = [list(map(int, input().split())) for _ in range(m)] # 명령어 배열
costs = defaultdict()
costs[A] = 0
q = [(0, A)] # 비용, 현재 문자열
while q:
cost, now = heappop(q)
if costs[now] > cost:continue # 최솟값보다 커지면 안 함
if now == goal:continue
for l, r, c in commands:
next_str = now[:l-1] + now[r-1] + now[l:r-1] + now[l-1] + now[r:]
if next_str in costs and costs[next_str] <= cost + c:continue
costs[next_str] = cost + c
heappush(q, (cost + c, next_str))
print(costs[goal] if goal in costs else -1)
반응형
'백준 문제풀이 코드저장소 > Gold' 카테고리의 다른 글
Baekjoon 2263. 트리의 순회 / Python (0) | 2024.12.30 |
---|---|
Baekjoon 12850. 본대 산책 2 / Python (0) | 2024.12.29 |
Baekjoon 10775. 공항 / Python (0) | 2024.12.28 |
Baekjoon 19236. 청소년 상어 / Python (0) | 2024.12.27 |