티스토리 뷰

PS/AtCoder

[Atcoder] ABC302 :: C - Almost Equal

뱃싸공 2023. 6. 2. 12:47
 

C - Almost Equal

AtCoder is a programming contest site for anyone from beginners to experts. We hold weekly programming contests online.

atcoder.jp

길이가 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
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함