티스토리 뷰
길이가 M인 문자열 N개가 주어진다. 우리가 해결해야 하는 문제는 이 문자열 N개를 랜덤하게 rearrange 했을때, i번째 문자열과 i+1번째 문자열의 차이가 1이 되게 만들 수 있는가?를 풀어야 한다.
아무리 단순하게 생각해봐도 이걸 해결하기 위한 알고리즘은 떠오르지가 않았다. 정렬로는 절대로 해결할 수 없고.. 전부 확인해야 하는것 아닌가?라는 생각이 들어 제한을 봤는데, N의 범위는 2이상 8이하로 주어진 것을 볼 수 있다.
그러면 문제는 아주 단순해진다. N개의 문자열로 만들 수 있는 rearrange 경우의 수를 전부 구하면 되기 때문이다. 그래서 모든 경우의 수를 찾기 위한 백트래킹을 수행하고, i번째 문자열과 i+1 번째 문자열을 비교했을때 차이가 1이하가 되는 경우가 존재하는지 확인하면 정답을 쉽게 구할 수 있다.
#include<iostream>
#include <vector>
#include <string>
#include <cstring>
using namespace std;
int N, M;
bool visited[10], flag = false;
vector<string> v, in;
void dfs(int s, int e) {
if (s == e) {
for (int i=0; i<N-1; i++) {
string s1 = v[i];
string s2 = v[i+1];
int cnt = 0;
for (int j=0; j<M; j++) {
if (s1[j] != s2[j]) cnt++;
}
if (cnt > 1) return;
}
flag = true;
return;
}
for (int i=0; i<N; i++) {
if (visited[i]) continue;
visited[i] = true;
v.push_back(in[i]);
dfs(s+1, e);
v.pop_back();
visited[i] = false;
}
}
int main()
{
memset(visited, false, sizeof(visited));
cin >> N >> M;
for (int i=0; i<N; i++) {
string s;
cin >> s;
in.push_back(s);
}
dfs(0, N);
if (flag) {
cout << "Yes" << '\n';
} else {
cout << "No" << '\n';
}
return 0;
}
'PS > AtCoder' 카테고리의 다른 글
[AtCoder] ABC305 (2) | 2023.06.10 |
---|---|
[Atcoder] ABC304 :: D - A Piece of Cake (1) | 2023.06.07 |
[AtCoder] ABC304 (4) | 2023.06.03 |
[Atcoder] ABC303 :: E - A Gift From the Stars (2) | 2023.06.01 |
[Atcoder] ABC303 :: D - Shift vs. CapsLock (2) | 2023.06.01 |