1765 - 닭싸움 팀 정하기
info
- 문제 보기: 1765 - 닭싸움 팀 정하기
- 소요 시간: 25분 43초
- 풀이 언어:
java - 체감 난이도: 3️⃣
- 리뷰 횟수: ✅
풀이 키워드
스포주의
그래프 유니온파인드
풀이 코드
info
- 메모리: 21416 KB
- 시간: 252 ms
import java.util.*;
import java.io.*;
public class Main
{
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static int n, m;
static int[][] rel;
static boolean[] visited;
static void connect(int x) {
// x 학생과 친구인 애들을 모두 visited 처리
for (int i = 1; i <= n; ++i) {
if (rel[x][i] == 1 && !visited[i]) {
visited[i] = true;
connect(i);
}
}
// x 학생의 '원수의 원수'도 모두 visited 처리
for (int i = 0; i <= n; ++i) {
if (rel[x][i] == -1) {
for (int j = 1; j <= n; ++j) {
if (rel[i][j] == -1 && !visited[j]) {
visited[j] = true;
connect(j); // 원수의 원수의 친구 & 원수의 원수의 원수의 원수도 찾기
}
}
}
}
}
public static void main(String[] args) throws IOException {
n = Integer.parseInt(br.readLine());
m = Integer.parseInt(br.readLine());
rel = new int[n+1][n+1];
visited = new boolean[n+1];
for (int i = 0; i < m; ++i) {
StringTokenizer st = new StringTokenizer(br.readLine());
String data = st.nextToken();
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
if (data.equals("F")) { // 친구 관계
rel[a][b] = rel[b][a] = 1; // 칭구
}
else { // 원수 관계
rel[a][b] = rel[b][a] = -1; // 남보다~ 못한~ 사이
}
}
// 친구끼리만 그룹핑하고 나머지는 싱글로 두면 최대 개수의 팀이 생성됨
int ans = 0;
for (int i = 1; i <= n; ++i) {
if (!visited[i]) {
visited[i] = true;
connect(i);
ans += 1;
}
}
System.out.println(ans);
}
}
풀이 해설
서로 연결연결된 친구 관계를 모두 찾기 위해 재귀를 이용했다.
친구 관계이면 강제로 한 팀이 되어야 하므로,
친구가 없는(...) 학생은 무조건 싱글플레이를 시켜야 가장 많은 팀 개수를 확보할 수 있다.
유니온파인드가 생각났긴 한데 또 로직 기억안나서 무지성 재귀 때림.