PS
[백준] 33888번 : 가오리 그래프[Java]
devkdh
2025. 7. 7. 17:01

#풀이
import java.io.*;
import java.util.*;
public class Main {
static int N;
static ArrayList<Integer>[] graph;
static int[] abcdef = new int[6]; // A B C D E F
static boolean[] visited;
static void dfs(int now) {
// E찾기
if(abcdef[4]==0&&graph[now].size()==4){
abcdef[4] = now;
}
// C찾기
if(abcdef[4]!=now&&graph[now].size()==4){
abcdef[2] = now;
return ;
}
visited[now] = true;
// B A D 찾기 (간선 3개인 노드)
if (graph[now].size() == 3) {
if(abcdef[1]==0) abcdef[1] = now;
else if(abcdef[0]==0)abcdef[0] = now;
else if(abcdef[3]==0)abcdef[3] = now;
}
for (int next : graph[now]) {
if (!visited[next]) {
dfs(next);
}
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
N = Integer.parseInt(br.readLine());
graph = new ArrayList[N+1];
visited = new boolean[N+1];
for(int i =0; i<N+1; i++){
graph[i] = new ArrayList<>();
}
int U,V;
for(int i = 0; i<N+3; i++){
st = new StringTokenizer(br.readLine());
U = Integer.parseInt(st.nextToken());
V = Integer.parseInt(st.nextToken());
graph[U].add(V);
graph[V].add(U);
}
for(int i = 0; i<graph.length; i++){
if(graph[i].size()==1){
dfs(i);
abcdef[5] = i;
}
}
// swap
if(abcdef[1]>abcdef[3]){ //D>B조건 만족
int temp = abcdef[3];
abcdef[3] = abcdef[1];
abcdef[1] = temp;
}
for(int k:abcdef)System.out.print(k+" ");
}
}
#성능

#정리
간선이 2개인 정점은 핵심 정점이 아니다.
탐색은 DFS로 수행한다.
1. 간선이 1개인 노드(꼬리 F)를 찾는다.
2. 꼬리부터 DFS를 타고, 간선이 4개인 노드를 만날 때까지 탐색한다. 이 노드를 발견하면 핵심 정점 E로 할당한다.
3. 이후 DFS로 끝까지 탐색한다.
3-1. 탐색 중 또 다른 간선 4개인 노드가 나온다면, 해당 노드를 핵심 정점 C로 할당한다.
3-2. 탐색 중 간선이 3개인 노드를 발견할 때마다 순서대로 핵심 정점 B, A, D에 값을 할당한다.
4. 마지막으로 D > B 조건을 만족하도록 순서를 조정한다.