[c++] BOJ 13023 :: ABCDE (ํ…Œ์ŠคํŠธ์ผ€์ด์Šค, ์ฝ”๋“œ)

ABCDE

https://www.acmicpc.net/problem/13023

์‹œ๊ฐ„ ์ œํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ ์ œ์ถœ ์ •๋‹ต ๋งž์€ ์‚ฌ๋žŒ ์ •๋‹ต ๋น„์œจ
2 ์ดˆ 512 MB 6509 1863 1222 28.399%

๋ฌธ์ œ

BOJ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์บ ํ”„์—๋Š” ์ด N๋ช…์ด ์ฐธ๊ฐ€ํ•˜๊ณ  ์žˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์€ 0๋ฒˆ๋ถ€ํ„ฐ N-1๋ฒˆ์œผ๋กœ ๋ฒˆํ˜ธ๊ฐ€ ๋งค๊ฒจ์ ธ ์žˆ๊ณ , ์ผ๋ถ€ ์‚ฌ๋žŒ๋“ค์€ ์นœ๊ตฌ์ด๋‹ค.

์˜ค๋Š˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์นœ๊ตฌ ๊ด€๊ณ„๋ฅผ ๊ฐ€์ง„ ์‚ฌ๋žŒ A, B, C, D, E๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ๊ตฌํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

  • A๋Š” B์™€ ์นœ๊ตฌ๋‹ค.
  • B๋Š” C์™€ ์นœ๊ตฌ๋‹ค.
  • C๋Š” D์™€ ์นœ๊ตฌ๋‹ค.
  • D๋Š” E์™€ ์นœ๊ตฌ๋‹ค.

์œ„์™€ ๊ฐ™์€ ์นœ๊ตฌ ๊ด€๊ณ„๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ์•ˆํ•˜๋Š”์ง€ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ์‚ฌ๋žŒ์˜ ์ˆ˜ N (5 ≤ N ≤ 2000)๊ณผ ์นœ๊ตฌ ๊ด€๊ณ„์˜ ์ˆ˜ M (1 ≤ M ≤ 2000)์ด ์ฃผ์–ด์ง„๋‹ค.

๋‘˜์งธ ์ค„๋ถ€ํ„ฐ M๊ฐœ์˜ ์ค„์—๋Š” ์ •์ˆ˜ a์™€ b๊ฐ€ ์ฃผ์–ด์ง€๋ฉฐ, a์™€ b๊ฐ€ ์นœ๊ตฌ๋ผ๋Š” ๋œป์ด๋‹ค. (0 ≤ a, b ≤ N-1, a ≠ b) ๊ฐ™์€ ์นœ๊ตฌ ๊ด€๊ณ„๊ฐ€ ๋‘ ๋ฒˆ ์ด์ƒ ์ฃผ์–ด์ง€๋Š” ๊ฒฝ์šฐ๋Š” ์—†๋‹ค.

์ถœ๋ ฅ

๋ฌธ์ œ์˜ ์กฐ๊ฑด์— ๋งž๋Š” A, B, C, D, E๊ฐ€ ์กด์žฌํ•˜๋ฉด 1์„ ์—†์œผ๋ฉด 0์„ ์ถœ๋ ฅํ•œ๋‹ค.

ํ…Œ์ŠคํŠธ์ผ€์ด์Šค

5 7
2 1
2 4
3 4
1 3
7 1
2 7
2 3
=> 1 (24317)
=> 1 (13427)

6 8
1 7
7 6
1 2
6 2
6 5
4 5
1 5
4 7
=> 1 (17654)

6 7
1 7
1 2
6 2
6 5
4 5
1 5
4 7
=> 1 (17456)

5 5
0 1
1 3
1 2
2 3
3 4
=> 1 (01234)

๋‚˜์˜ ๋‹ต

์•Œ๊ณ ๋ฆฌ์ฆ˜
  1. ์นœ๊ตฌ ๊ด€๊ณ„๋ฅผ ์ €์žฅํ•œ๋‹ค.
  2. brute force๋กœ ์นœ๊ตฌ๊ด€๊ณ„๋ฅผ ํ•˜๋‚˜์”ฉ ์‚ดํ”ผ๋ฉด์„œ 5๋ช…์ด ์—ฐ๋‹ฌ์•„ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋Š”์ง€ testํ•œ๋‹ค.
  • 2๋ฒˆ ๊ณผ์ •์—์„œ ์นœ๊ตฌ๊ด€๊ณ„๋Š” (a,b) (b,a) ๋ฅผ ๋”ฐ๋กœ ๋‹ค ๊ณ„์‚ฐํ•ด์•ผํ•จ

  • 2๋ฒˆ์—์„œ ์นœ๊ตฌ๋ฅผ ์ฐพ๋Š” ๊ณผ์ •์˜ ๋ณต์žก๋„๋ฅผ ์ตœ๋Œ€ํ•œ ์ค„์—ฌ์•ผํ•จ

    ๋‹จ์ˆœํ•˜๊ฒŒ ์ƒ๊ฐํ•ด์„œ arr๋กœ ์ฒ˜๋ฆฌํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ๋„ ๋งŽ์ด ์žก์•„๋จน๊ณ  ์ฐพ๊ธฐ๋„ ํž˜๋“ค๋‹ค. 2000๋ฒˆ์„ ๋‹ค ์‚ดํŽด๋ณด์•„์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ.

  • ๋”ฐ๋ผ์„œ ๋ณธ์ธ์€ map์œผ๋กœ ๊ตฌํ˜„ํ•˜์—ฌ ํ•ด๋‹น ์‚ฌ๋žŒ์˜ ์นœ๊ตฌ๋งŒ ๋นผ์˜ค๋Š” ์‹์œผ๋กœ ์ง„ํ–‰ํ•˜์˜€๋‹ค.

  • 2๋ฒˆ์—์„œ 5๋ช… ์ค‘์— ๊ฐ™์€ ์‚ฌ๋žŒ์ด ๋‚˜์˜ค์ง€ ์•Š๋„๋ก ์ฒ˜๋ฆฌํ•ด์•ผํ•จ

    ์ฒ˜์Œ ์ฝ”๋“œ์—์„œ๋Š” ๊ทธ๋ƒฅ 5๋ช…์˜ ์‚ฌ๋žŒ์„ ๋‹ด๋Š” arr์— ์žˆ๋Š”์ง€ ์—†๋Š”์ง€๋ฅผ ์ฆ‰์‹œ checkํ•˜๋Š” ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•˜์˜€๋Š”๋ฐ, ์ฃผ์˜ํ•  ์ ์€ ์ดˆ๊ธฐํ™”๋ฅผ -1๋กœ ํ•ด๋‘๋Š” ๊ฒƒ์ด๋‹ค.

    => ์ดˆ๊ธฐํ™”๋ฅผ ํ•˜์ง€ ์•Š์œผ๋ฉด 0์œผ๋กœ ์ดˆ๊ธฐํ™”๋˜๊ธฐ ๋•Œ๋ฌธ์— 0๋ฒˆ์งธ ์‚ฌ๋žŒ์ด ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ฒ˜๋ฆฌ๋œ๋‹ค.

  • ๋”ฐ๋กœ visitedํ–ˆ๋Š”์ง€ checkํ•˜๋Š” arr๋ฅผ ๋‘๊ณ  ํ•ด๋„ ์ •๋‹ต์ฒ˜๋ฆฌ ๋œ๋‹ค.

์ฝ”๋“œ

<์ฒซ๋ฒˆ์งธ ์ฝ”๋“œ>

#include <iostream>
#include <vector>
#include <map>
#include <algorithm>

using namespace std;
int N, M;
map<int, vector<int>> friends;
map<int, vector<int>>::iterator iter;
int arr[5];

bool isInArr(int num) {
    for (int i = 0; i < 5; i++) { // 5
        if (arr[i] == num)
            return true;
    }
    return false;
}

int fiveFriends(int* in, int size) {
    if (size == 5) {
        return 1;
    }

    int last_person = in[size-1];
    auto tmp_v = friends[last_person];
    int v_size = tmp_v.size();
    for (int i = 0; i < v_size; i++) { // 2*10^3
        if (!isInArr(tmp_v[i])) {// arr์— ์—†์œผ๋ฉด
            in[size] = tmp_v[i];
            if (fiveFriends(in, size + 1) == 1) // ๊นŠ์ด 5 => ์ตœ๋Œ€ 3๋ฒˆ => 2*10^9
                return 1;
            in[size] = -1;
        }
        else
            continue;
    }
    return 0;
}

int main() {
    cin >> N >> M;
    while(M--){
        int a, b;
        cin >> a >> b;
        friends[a].push_back(b); friends[b].push_back(a);
    }

    int flag = 0;

    for (iter = friends.begin(); iter != friends.end(); iter++) { // 2*2*10^3
        auto tmp = *iter;
        arr[0] = tmp.first;

        auto tmp_v = tmp.second;
        int v_size = tmp_v.size();
        for (int i = 0; i < v_size; i++) {
            arr[1] = tmp_v[i];
            if (fiveFriends(arr, 2) == 1) {
                flag = 1;
                break;
            }
            arr[1] = -1;
        }
        if (flag)
            break;
        arr[0] = -1;
    }

    cout << flag;
}

<๋‘๋ฒˆ์งธ ์ฝ”๋“œ>

๋ฐ”๋€ ์ ์€ //* ๋กœ ํ‘œ์‹œํ•ด๋‘์—ˆ๋‹ค.

#include <iostream>
#include <vector>
#include <map>
#include <algorithm>

using namespace std;
int N, M;
map<int, vector<int>> friends;
map<int, vector<int>>::iterator iter;
int visited[2000];
int arr[5];

/*
bool isInArr(int num) {
    for (int i = 0; i < 5; i++) { // 5
        if (arr[i] == num)
            return true;
    }
    return false;
}
*/

int fiveFriends(int* in, int size) {
    if (size == 5) {
        return 1;
    }

    int last_person = in[size-1];
    auto tmp_v = friends[last_person];
    int v_size = tmp_v.size();
    for (int i = 0; i < v_size; i++) { // 2*10^3
        if (visited[tmp_v[i]]==0) {// arr์— ์—†์œผ๋ฉด //*
            in[size] = tmp_v[i];
            visited[tmp_v[i]] = 1; //*
            if (fiveFriends(in, size + 1) == 1) // ๊นŠ์ด 5 => ์ตœ๋Œ€ 3๋ฒˆ => 2*10^9
                return 1;
            visited[tmp_v[i]] = 0; //*
        }
        else
            continue;
    }
    return 0;
}

int main() {
    cin >> N >> M;
    while(M--){
        int a, b;
        cin >> a >> b;
        friends[a].push_back(b); friends[b].push_back(a);
    }

    int flag = 0;

    for (iter = friends.begin(); iter != friends.end(); iter++) { // 2*2*10^3
        auto tmp = *iter;
        arr[0] = tmp.first;
        visited[tmp.first] = 1; //*

        auto tmp_v = tmp.second;
        int v_size = tmp_v.size();
        for (int i = 0; i < v_size; i++) {
            arr[1] = tmp_v[i];
            visited[tmp_v[i]] = 1; //*
            if (fiveFriends(arr, 2) == 1) {
                flag = 1;
                break;
            }
            visited[tmp_v[i]] = 0; //*
        }
        if (flag)
            break;
        visited[tmp.first] = 0; //*
    }

    cout << flag;
}

 

+

  • vector์˜ ์ตœ๋Œ€ ํฌ๊ธฐ๋Š” 32bit ์ปดํ“จํ„ฐ ๊ธฐ์ค€์œผ๋กœ 10^9๊ฐœ

  • return ํ˜•์‹์ด void๊ฐ€ ์•„๋‹ˆ๋ฉด ๋ฌด์กฐ๊ฑด returnํ•ด์ฃผ์–ด์•ผํ•จ

    => ์•„๋‹ˆ๋ฉด ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ

  • ์ดˆ๊ธฐํ™” ์ž˜ ํ•ด์ฃผ๊ธฐ

๋ฐ˜์‘ํ˜•