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)
๋์ ๋ต
์๊ณ ๋ฆฌ์ฆ
- ์น๊ตฌ ๊ด๊ณ๋ฅผ ์ ์ฅํ๋ค.
- 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ํด์ฃผ์ด์ผํจ
=> ์๋๋ฉด ๋ฐํ์ ์๋ฌ
-
์ด๊ธฐํ ์ ํด์ฃผ๊ธฐ
'Algorithm ๋ฌธ์ > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[c++] BOJ 12865 :: ํ๋ฒํ ๋ฐฐ๋ญ (0) | 2021.03.12 |
---|---|
[c++] BOJ 11054 :: ๊ฐ์ฅ ๊ธด ๋ฐ์ดํ ๋ ๋ถ๋ถ ์์ด (1) | 2021.03.06 |
[c++] BOJ 1393๋ฒ :: ์ํ์ฒ ๋ ๊ตฌ๊ตฌํ (์ฝ๋, ์ฃผ์ํ ์ , ํ ์คํธ์ผ์ด์ค) (0) | 2020.05.02 |
[c++] BOJ 1107๋ฒ :: ๋ฆฌ๋ชจ์ปจ (์ฝ๋, ํ ์คํธ์ผ์ด์ค) (0) | 2020.05.02 |
[c++] BOJ 1309๋ฒ :: ๋๋ฌผ์ (0) | 2020.04.25 |
Comment