halang-log
💡 PS

[BOJ] 1327 소트 게임

date
Mar 8, 2022
slug
boj-1327
author
status
Public
tags
PS
summary
소트 게임에 대한 풀이입니다.
type
Post
thumbnail
category
💡 PS
updatedAt
Aug 3, 2023 09:06 AM
언어

문제

풀이

소트를 하여 만들 수 있는 문자열을 정점으로 보고, 해당 문자열에서 소트할 수 있는 방식들을 간선으로 보아 BFS로 풀었다. 예를 들어, 1234 문자열에서 k가 3일 경우, 소트 할 수 있는 방식 중 하나는 1~3을 뒤집는 것이다. 그러면 3214가 되어 이를 큐에 넣어주고 cnt를 하나 증가해주었다. 이런식으로 탐색하면서 t와 같을 경우 cnt를 리턴해주고 while문을 빠져나오면 t로 정렬이 불가능하므로 -1을 리턴해주었다.
시간복잡도를 계산해보면 가능한 문자열의 상태 n!, 상태 마다 생기는 간선 n, 소트 할 때 걸리는 시간 k이므로 O(n!*nk) 이다.

코드

#include <iostream> #include <cstdio> #include <algorithm> #include <queue> #include <map> using namespace std; typedef pair<string, int> psi; string s, t; int n, k; char c; map<string, int> mp; int go() { queue<psi> q; sort(s.begin(), s.end()); q.push({s, 0}); mp[s] = 1; while (!q.empty()) { string now = q.front().first; int cnt = q.front().second; q.pop(); if (now == t) return cnt; for(int i = 0; i < n-k+1; i++) { string tmp = now.substr(i, k), nxt; reverse(tmp.begin(), tmp.end()); nxt = now.substr(0, i) + tmp + now.substr(i+k, now.size()); if (mp.find(nxt) != mp.end()) continue; mp[nxt] = 1; q.push({nxt, cnt + 1}); } } return -1; } int main() { scanf("%d %d", &n, &k); for(int i = 0; i < n; i++) { scanf(" %c", &c); s += c; } t = s; printf("%d", go()); }