https://www.acmicpc.net/problem/13023
코테 준비를 할때마다 느끼는 건데, 진짜 30분안에 안풀리면 무조건 답지를 보자.
오히려 내 방식대로 풀려다가 1시간 2시간 지나고 못풀면 그 자괴감이 더 크다.
심지어 푸는 방식도 달라서 내 접근법이 아예 틀렸을땐 정신적인 타격또한 후...
그나마 오늘푼건 1시간정도 끙끙대쓴데, 접근법은 맞아서 50%정도만 아팠다
내용은 간단하다
각 친구관계 사이가 주어졌을때 5명이 이어져서 친구인 관계가 존재하는가?
나는 여기서
어라, 이거 dfs로 depth 가 4일때 끊으면 되는거 아닌가? 생각하고
그 각 값을 저장해줄 struct를 따로 만들어 보자고 생각했다
예를들어 struct s{
bool arr[2000]
}
을 하고, s를 배열로 정하는 거다
그래서 s[i].arr[j] 이렇게 정해서
arr이 true인 경우, 그 값으로 이어지는 거네?
그럼 타고타고 건너가서
depth가 4인경우가 존재하면 1 다 돌고 없으면 0으로하면되겟네
하고했는데
#include <iostream>
#include <string>
using namespace std;
bool visited[2000];
struct relation
{
int arr[2000] = {0};
};
relation f[2000];
int n, m;
void task(int depth, int idx);
int main()
{
cin >> n >> m;
for (int i = 0; i < m; i++)
{
int x, y;
cin >> x >> y;
f[x].arr[y] = 1;
f[y].arr[x] = 1;
}
for (int i = 0; i < n; i++)
{
task(0, 0);
}
cout << 0 << "\n";
}
void task(int depth, int idx)
{
if (depth == 4)
{
cout << 1 << "\n";
exit(0);
}
for (int j = 0; j < n; j++)
{
if (f[idx].arr[j] == 1 && !visited[idx])
{
visited[idx] = true;
task(depth + 1, j);
visited[idx] = false;
}
}
}
그래.. 어찌 세상이 그리 쉽겠는가
대충 풀이 접근 자체는 맞는거 같은데 시간초과가 너무 많이 났다..
나 죽는줄
시간초과가 나는 이유를 계속 고민해봤는데
아무리봐도 모든 노드를 확인하는 저 두번째 for문이 문제인 것 같았다
for (int j = 0; j < n; j++)
{
if (f[idx].arr[j] == 1 && !visited[idx])
{
visited[idx] = true;
task(depth + 1, j);
visited[idx] = false;
}
}
요놈;;
요놈;;
그래서 인터넷 검색을 한 결과, fifo인 vector를 사용하면 저렇게 모든 노드를 돌지 않고, 각 인덱스에 접근할 수 있겠더라
난 왜 저 생각을 못했나
#include <iostream>
#include <string>
#include <vector>
using namespace std;
bool visited[2000];
vector<int> f[2000];
int n, m;
void task(int depth, int idx);
int main()
{
cin >> n >> m;
if (m < 4)
{
cout << 0 << "\n";
exit(0);
}
for (int i = 0; i < m; i++)
{
int x, y;
cin >> x >> y;
f[x].push_back(y);
f[y].push_back(x);
}
for (int i = 0; i < n; i++)
task(0, i);
cout << 0 << "\n";
}
void task(int depth, int idx)
{
if (depth == 4)
{
cout << 1 << "\n";
exit(0);
}
visited[idx] = true;
for (int j = 0; j < f[idx].size(); j++)
{
if (!visited[f[idx][j]])
{
task(depth + 1, f[idx][j]);
}
}
visited[idx] = false;
}
vector 가 참 좋은듯
'코딩 테스트 준비! (백준) > DFS' 카테고리의 다른 글
[DFS] 백준 16947번 서울 지하철 2호선(C++) (0) | 2025.05.01 |
---|---|
[DFS,BFS] 백준 1260번 BFS와 DFS(C++) (0) | 2025.04.21 |
[DFS] 백준 1182번 부분 수열의 합(C++) (0) | 2025.04.15 |
[DFS] 백준 2529번 부등호(C++) (0) | 2025.04.14 |
[DFS] 백준 1248번 Guess(C++) (0) | 2025.04.14 |