❌[BOJ] 6416 - 트리인가?

suhyun·2022년 11월 2일
0

백준/프로그래머스

목록 보기
33/81

문제 링크

6416-트리인가?


입력

입력은 여러 개의 테스트 케이스로 이루어져 있으며, 입력의 끝에는 두 개의 음의 정수가 주어진다.
각 테스트 케이스는 여러 개의 정수쌍으로 이루어져 있으며, 테스트 케이스의 끝에는 두 개의 0이 주어진다.
각 정수쌍 u, v에 대해서 이는 노드 u에서 노드 v로 가는 간선이 존재함을 의미한다. u와 v는 0보다 크다.


출력

각 테스트 케이스에 대해서, 테스트 케이스의 번호가 k일 때(k는 1부터 시작하며, 1씩 증가한다) 트리일 경우 "Case k is a tree."를, 트리가 아닐 경우 "Case k is not a tree."를 출력한다.


문제 풀이

Set과 ArrayList사용

들어오는, 나가는 점을 모두 저장하는 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.");
            }

        }

    }
}
profile
꾸준히 하려고 노력하는 편 💻

0개의 댓글