본문 바로가기

프로그래밍_백준/Java

Java) 1764 듣보잡

728x90
반응형

이 문제는 듣도 못한 사람, 보도 못한 사람의 명단을 따로 입력 받고

두 명단에서 겹치는 사람 인원과 이름을 출력하는 문제입니다.

 

1. 두 명단을 입력을 받아 배열에 저장합니다.

2. HashSet을 이용하여 교집합을 찾습니다.

3. 이를 정렬하여 출력합니다.

 

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in); // 스캐너 객체 생성
        int n, k;
        n = sc.nextInt(); // 듣도 못한 사람의 수 입력 받음
        k = sc.nextInt(); // 보도 못한 사람의 수 입력 받음
        sc.nextLine();  // 개행문자 제거

        String[] never_listen = new String[n];  // 듣도 못한 사람들의 이름을 저장할 배열 선언
        String[] never_seen = new String[k];  // 보도 못한 사람들의 이름을 저장할 배열 선언
        
        for (int i = 0; i < n; i++) {
            never_listen[i] = sc.nextLine();  // 듣도 못한 사람들의 이름 입력 받음
        }
        
        for (int i = 0; i < k; i++) {
            never_seen[i] = sc.nextLine();   // 보도 못한 사람들의 이름 입력 받음
        }
        
         /* HashSet은 중복된 값을 허용하지 않는 자료구조입니다. 
           이를 이용해 각각 듣지도, 보지도 못한 사람들의 집합을 생성합니다. */
           
       Set<String> neverListenSet = new HashSet<>(Arrays.asList(never_listen)); 
       Set<String> neverSeenSet= new HashSet<>(Arrays.asList(never_seen));
       
       /* retainAll 메소드는 교집합을 구하는 메소드로, 호출하는 셋에 대해 인자로 주어진 셋과 공통된 요소만 남기고 나머지는 제거합니다.
          즉, 아래 코드는 듣지도 보지도 못한사람들 집합이 됩니다.*/
          
       neverListenSet.retainAll(neverSeenSet);
       
       List<String> sortedList= new ArrayList<>(neverListenSet);   /* List로 변환 후 */
       
       Collections.sort(sortedList);   /* 정렬 */

       System.out.println(sortedList.size());   /* 듣보잡인 사람들의 수 출력 */
       
       for(String name : sortedList){
           System.out.println(name);    /* 알파벳 순으로 정렬된 '듣보잡' 리스트를 출력 */
           
      }
      
      sc.close();
    }
}
728x90
반응형