[BaekJoon] #1764 듣보잡

현굥·2024년 9월 14일

BaekJoon

목록 보기
28/53


문제이해

이 문제는 입력으로 듣지도 못한 사람N명, 보지도 못한 사람 M명이 주어지고, 둘째줄부터는 N명의 사람과 M명의 사람이 주어집니다.
N과 M명 중 공통인물인 듣도 보도 못한 사람의 명수와 명단을 출력해야하는 문제입니다.

뭔가 문제가 귀엽다. 듣도보도라는 표현을 골똘히 생각해서 듣는것과 보는것의 의미를 나누어서 문제로 만든게 귀여워서 푸는데 기분이 조았다 ㅋㅋㅋ

입력

입력으로는 N과 M이 주어지고, 그 다음 N+M 명의 사람의 이름이 주어집니다.

출력

출력으로는, 입력으로 주어진 듣도못한 사람 N명과 보도 못한 사람 M명중 듣도 보도 못한 사람의 명수와 명단을 출력하면 됩니다.


문제접근

이 문제를 풀기 위해 두가지 방법을 생각해보았습니다.

  1. HashSet

이 문제를 풀기 위해 우리가 구해야 하는것은 결국, 입력으로 주어지는 원소의 중복원소와 중복된 원소의 갯수입니다. 키 값을 이름으로 입력하여 처리하기 위해 HashSet을 이용해주었습니다.
출력할때에는 사전순으로 정렬 한 다음 출력해주어야 합니다.
사전순으로 정렬하기 위해 Collections.sort를 이용하면 될 것 입니다. 그러기 위해서는 set을 List형태로 변환해주어야 합니다.

  1. TreeSet

사전순으로 정렬하는 방법에는

  1. Collections.sort()
  2. Arrays.sort()
  3. TreeSet
  4. Stream API

가 있습니다.

TreeSet을 이용하면 삽입과 동시에 정렬된다고 합니다.

그렇게 되면 굳이 set을 List으로 변환하지 않아도 됩니다.

두가지 방법으로 문제를 풀어보겠습니다.


solutions

1. HashSet

입력값 파싱

  • 입력을 위해 BufferedReader를 이용하였습니다.

  • 값의 분리를 위해 StringTokenizer를 이용하였습니다.

  • N개의 데이터를 넣을 HashSet과, M개의 데이터를 넣을 HashSet 객체를을 각각 선언해주어, 반복문을 통해 각각의 원소들을 집어넣어주었습니다.

중복 원소 제거

  • retainAll 메소드를 이용하여, 두 집합의 중복원소를 제외한 나머지 원소를 제거해주었습니다.

사전 순으로 정렬

  • 사전순으로 정렬하기 위해 Collection.sort()메소드를 이용해주었습니다.

Collections.sort(List list)

  • Collections.sort()는 입력값으로 list를 입력받습니다. 메소드를 이용하기 위해서는 set를 List의 형태로 변환해주어야 합니다.
    변환 이후, Collection.sort() 를 이용해주면 됩니다. 위의 과정을 담은 코드는 아래와 같습니다.

2. TreeSet

  • HashSet의 방법과 거의 유사합니다.

  • 달라지는 점은, set을 굳이 정렬하기 위해 list으로 변환하지 않아도 됩니다.

  • HashSet과 동일하게 retainAll()메소드를 이용해서 똑같이 중복원소를 제거하고, 크기를 출력하고, Set의 모든 원소를 출력해주면 됩니다.

    ㅎ 정렬하는 방법 뭐뭐있나 알아보다 우와 하고 풀어봤는데 딱히 별 메리트는 없는 것 같음
    사진보니까 간결해진게 뭔가 좋은 것 같긴 한데 보통 원소 정렬을 위해 HashSet + Collections.sort() 조합을 이용하거나, 배열을 이용하는 경우에는 Arrays.sort()를 이용하는데 TreeSet쓰는건 못본 것 같움
    결론은 정렬이 필요없다면 HashSet이 더 빠르답니다.


HashSet 출력부

TreeSet 출력부


code

  1. HashSet
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int N = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());
        HashSet<String> setN = new HashSet<>();
        HashSet<String> setM = new HashSet<>();
        StringBuilder sb = new StringBuilder();

        for (int i = 0; i < N; i++) {
            setN.add(br.readLine());
        }

        for (int i = 0; i < M; i++) {
            setM.add(br.readLine());
        }
        setN.retainAll(setM);
        List<String> list = new ArrayList<>(setN);
        Collections.sort(list);
        System.out.println(setN.size());
        for (String s : list) {
            System.out.println(s);

        }

    }

}
  1. TreeSet
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.*;

public class Main {
  public static void main(String[] args) throws IOException {
      BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
      StringTokenizer st = new StringTokenizer(br.readLine());
      int N = Integer.parseInt(st.nextToken());
      int M = Integer.parseInt(st.nextToken());
      TreeSet<String> setN = new TreeSet<>();
      TreeSet<String> setM = new TreeSet<>();

      for (int i = 0; i < N; i++) {
          setN.add(br.readLine());
      }

      for (int i = 0; i < M; i++) {
          setM.add(br.readLine());
      }
      
      setN.retainAll(setM);
      System.out.println(setN.size());
      for(String s : setN){
          System.out.println(s);
      }
  }

}




0개의 댓글