알고리즘
[백준]1953_팀배분_DFS(BFS도 가능)
Lahezy
2023. 2. 22. 16:14
728x90
🔗 문제링크 🔗
1953번: 팀배분
첫줄에는 청팀의 사람의 수를 출력하고, 그리고 둘째 줄에는 청팀에 속한 사람들을 오름차순으로 나열한다. 그리고 셋째 줄과 넷째 줄은 위와 같은 방법으로 백팀에 속한 인원의 수, 백팀에 속
www.acmicpc.net
🌟 생각 흐름 🌟
우선 문제를 풀기 위해서 싫어하는 사람들과의 표기를 그래프를 통해서 진행했다
그래프를 그린 후 한 노드에서 시작한 경우 현재 노드와 다음노드만 다른 팀이면 가능하다고 생각했다
그리고 그 다음노드에서의 다음노드가 서로 다른 팀이면 가능하다는 식으로 dfs로 구현하였다
그래서 한 노드에서 시작한후 현재 깊이가 짝수이면 청팀, 홀수 이면 백팀에 넣도록 코드를 구현하였다
예를 들어 1,2가 서로를 싫어하고 2,3이 서로를 싫어하는 경우
↔️ : 서로 싫어하는 경우 포기
1️⃣ ↔️ 2️⃣ ↔️ 3️⃣ 와 같이 표기할 수 있고
1에서 시작한 경우 아래와 같다.
1️⃣ : 청팀(깊이 0)
2️⃣ : 백팀(깊이 1)
3️⃣ : 청팀(깊이 2)
🍳 코드 🍳
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package 백준.graph; | |
import java.io.BufferedReader; | |
import java.io.IOException; | |
import java.io.InputStreamReader; | |
import java.util.ArrayList; | |
import java.util.Collections; | |
import java.util.List; | |
import java.util.StringTokenizer; | |
public class boj_1953_팀배분 { | |
private static boolean[] visited; | |
private static List<Integer>[] hates; | |
private static final List<Integer>[] teams = new List[2]; | |
private static final StringBuilder sb = new StringBuilder(); | |
public static void main(String[] args) throws IOException { | |
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); | |
StringTokenizer st; | |
int n = Integer.parseInt(br.readLine()); | |
//init | |
visited = new boolean[n + 1]; | |
hates = new List[n + 1]; | |
for (int i = 0; i < 2; i++) { | |
teams[i] = new ArrayList<>(); | |
} | |
for (int i = 0; i <= n; i++) { | |
hates[i] = new ArrayList<>(); | |
} | |
//input | |
for (int i = 1; i <= n; i++) { | |
st = new StringTokenizer(br.readLine()); | |
int cnt = Integer.parseInt(st.nextToken()); | |
for (int j = 0; j < cnt; j++) { | |
hates[i].add(Integer.parseInt(st.nextToken())); | |
} | |
} | |
//solution | |
for (int i = 1; i <= n; i++) { | |
if (!visited[i]) { | |
dfs(i, 0); | |
} | |
} | |
//output | |
setTeam(teams[0]); | |
setTeam(teams[1]); | |
System.out.println(sb); | |
} | |
private static void setTeam(List<Integer> team) { | |
Collections.sort(team); | |
sb.append(team.size()).append("\n"); | |
for (Integer now : team) { | |
sb.append(now).append(" "); | |
} | |
sb.append("\n"); | |
} | |
private static void dfs(int start, int nowCnt) { | |
if (!visited[start]) { | |
visited[start] = true; | |
teams[nowCnt % 2].add(start); | |
for (Integer hate : hates[start]) { | |
dfs(hate, nowCnt + 1); | |
} | |
} | |
} | |
} |
728x90