문제
https://www.acmicpc.net/problem/1327
1327번: 소트 게임
홍준이는 소트 게임을 하려고 한다. 소트 게임은 1부터 N까지 정수로 이루어진 N자리의 순열을 이용한다. 이 게임에선 K가 주어진다. 어떤 수를 뒤집으면, 그 수부터 오른쪽으로 K개의 수를 뒤집
www.acmicpc.net
풀이
일단 BFS로 풀어야 한다는 건 알겠는데 도대체 방문배열을 어떻게 처리해야할지 감이 안 잡혔다.
큐에 배열이 포함되어야 할텐데 배열을 어떻게 들고 다녀야할지도 모르겠어서 답을 좀 참고했다.
배열은 문자열로 바꾸면 되고, 방문배열은 값 존재 여부 확인을 편하게 하기 위해 set으로 만들었다.
그외에는 일반 BFS와 유사하게 가능한 경우를 다 돌면서 큐에 저장하면 된다.
코드
#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
#include <set>
using namespace std;
int N, K;
set<string> visited;
string s = "";
int bfs(string str) {
queue<pair<string, int>> q;
visited.insert(str);
q.push({str, 0});
string target = str;
sort(target.begin(), target.end());
while (!q.empty()) {
string cur = q.front().first;
int cnt = q.front().second;
q.pop();
if (cur == target) return cnt;
for (int i = 0; i <= N - K; i++) {
string tmp = cur.substr(i, K);
reverse(tmp.begin(), tmp.end());
tmp = cur.substr(0, i) + tmp + cur.substr(i + K, N - i + K);
if (visited.find(tmp) == visited.end()) {
visited.insert(tmp);
q.push({tmp, cnt + 1});
}
}
}
return -1;
}
int main() {
cin >> N >> K;
for (int i = 0; i < N; i++) {
char c;
cin >> c;
s += c;
}
cout << bfs(s);
}
'알고리즘 > 문제 풀이' 카테고리의 다른 글
프로그래머스 - 전력망을 둘로 나누기(C++) (0) | 2024.05.02 |
---|---|
백준 1283 - 단축키 지정 (C++) (1) | 2024.03.29 |
백준 14226 - 이모티콘 (C++) (0) | 2024.03.22 |
백준 23300 - 웹 브라우저 2 (C++) (0) | 2024.03.21 |
백준 2470 - 두 용액 (C++) (0) | 2024.03.19 |