fragment-header
fragment-markdown
홈
로그인
로그아웃
내 블로그
설정
로그인
백준 28707 (C++) 배열 정렬
최초 업로드: 2025-07-31 02:47:43
최근 수정 시간: 2025-07-31 02:47:43
게시자: rlatjwls3333
카테고리: 백준
조회수: 16
# [Gold I] 배열 정렬 [문제 링크](https://www.acmicpc.net/problem/28707) ## 문제 설명 <p>길이가 $N$인 양의 정수로 이루어진 배열 $A = [A_1, A_2, \cdots, A_N]$이 주어집니다. 이 배열을 비내림차순, 즉, $A_1 \le A_2 \le \cdots \le A_N$이 되도록 정렬하기 위해서 다음과 같은 $M$가지 조작을 순서와 횟수에 상관 없이 원하는 만큼 할 수 있습니다.</p> <ul> <li>$A$의 $l_i$번째 수와 $r_i$번째 수를 바꿉니다. 비용은 $c_i$가 듭니다. $(1 \le i \le M)$</li> </ul> <p>$A$를 비내림차순으로 정렬하기 위해 필요한 비용 총합의 최솟값을 출력하세요.</p> ## 입력 <p>첫 줄에 배열 $A$의 길이 $N$이 주어집니다. $(2 \le N \le 8)$</p> <p>둘째 줄에 $A$의 각 원소 $A_1, \cdots, A_N$이 공백으로 구분되어 주어집니다. $(1 \le A_i \le 10)$</p> <p>셋째 줄에 조작의 개수 $M$이 주어집니다. $(1 \le M \le 10)$</p> <p>다음 $M$개의 줄의 $i$번째 줄에 조작을 의미하는 세 개의 정수 $l_i, r_i, c_i$가 공백으로 구분되어 주어집니다. $(1 \le l_i < r_i \le N;$ $1 \le c_i \le 10)$</p> ## 출력 <p>첫 줄에 배열 $A$를 비내림차순으로 정렬하기 위해 필요한 비용 총합의 최솟값을 출력하세요. 단, 배열을 비내림차순으로 만드는 것이 불가능한 경우 대신 $-1$을 출력하세요.</p> ## 풀이 #### 상태를 우선순위 큐에 넣어 다익스트라로 최소 비용을 찾아주었다. 중복확인은 시간이 넉넉해 맵에 벡터를 그대로 넣어서 비교해주었다. ``` c++ #include<bits/stdc++.h> using namespace std; struct element { vector<int> v; int cost; bool operator<(const element e) const { return cost > e.cost; } }; map<vector<int>, int> minCost; vector<vector<pair<int, int>>> conn(10); int main() { ios::sync_with_stdio(0); cin.tie(0); int n; cin >> n; vector<int> A(n); for(int i=0;i<n;i++) cin >> A[i]; int m; cin >> m; while(m--) { int l, r, c; cin >> l >> r >> c; conn[l-1].push_back({r-1, c}); conn[r-1].push_back({l-1, c}); } priority_queue<element> pq; pq.push({A, 0}); while(!pq.empty()) { auto cur = pq.top(); pq.pop(); if(minCost.count(cur.v) && minCost[cur.v] <= cur.cost) continue; minCost[cur.v] = cur.cost; for(int i=0;i<n;i++) { for(auto next : conn[i]) { element n = {cur.v, cur.cost+next.second}; swap(n.v[i], n.v[next.first]); if(minCost.count(n.v) && minCost[n.v] <= n.cost) continue; pq.push(n); } } } sort(A.begin(), A.end()); cout << (minCost.count(A) ? minCost[A] : -1); } ```