입력은 여러 개의 테스트 케이스로 이루어져 있으며, 입력의 끝에는 두 개의 음의 정수가 주어진다.
각 테스트 케이스는 여러 개의 정수쌍으로 이루어져 있으며, 테스트 케이스의 끝에는 두 개의 0이 주어진다.
각 정수쌍 u, v에 대해서 이는 노드 u에서 노드 v로 가는 간선이 존재함을 의미한다. u와 v는 0보다 크다.
각 테스트 케이스에 대해서, 테스트 케이스의 번호가 k일 때(k는 1부터 시작하며, 1씩 증가한다) 트리일 경우 "Case k is a tree."를, 트리가 아닐 경우 "Case k is not a tree."를 출력한다.
들어오는, 나가는 점을 모두 저장하는 set1,
들어오는 점만 저장하는 set2,
들어오는 점을 저장하는 list 세개를 만들어
set1에서 set2와 중복되는 것을 제거했는데 사이즈가 1이 아니라면 규칙1 위반
set2와 list를 비교했을 때 사이즈 차이가 난다면 중복되는 화살표 방향이 존재하는것 -> 규칙2위반
이런 방법으로 풀었는데 뭐 그냥 바로 틀렸습니다...
방법을 잘 모르겠다..
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
for (int tc = 1; ; tc++) {
HashSet<Integer> firstSet = new HashSet<>();
HashSet<Integer> secondSet = new HashSet<>();
ArrayList<Integer> second = new ArrayList<>();
while (true) {
int u = sc.nextInt();
int v = sc.nextInt();
if (u == 0 && v == 0) break;
if (u == -1 && v == -1) return;
firstSet.add(u);
firstSet.add(v);
secondSet.add(v);
second.add(v);
}
boolean flag = true;
if (firstSet.size() == 0) {
flag = true;
}
firstSet.removeAll(secondSet);
if (firstSet.size() > 1) {
flag = false;
}
if (second.size() != secondSet.size()) {
flag = false;
}
if (flag) {
System.out.println("Case " + tc + " is a tree.");
} else {
System.out.println("Case " + tc + " is not a tree.");
}
}
}
}