본문 바로가기
백준

[백준] 1764번 : 듣보잡 – JAVA [자바]

by Hongwoo 2022. 4. 17.
반응형

https://www.acmicpc.net/problem/1764

 

1764번: 듣보잡

첫째 줄에 듣도 못한 사람의 수 N, 보도 못한 사람의 수 M이 주어진다. 이어서 둘째 줄부터 N개의 줄에 걸쳐 듣도 못한 사람의 이름과, N+2째 줄부터 보도 못한 사람의 이름이 순서대로 주어진다.

www.acmicpc.net

 


  • 문제

 

 


  • 문제 풀이

백준 1764번 듣보잡은 실버 4 난이도의 문자열, 해시 맵, 그리고 정렬을 사용해서 푸는 문제이다. 이 많은 것들이 한 문제에 들어있지만 그래도 어려운 거 없는 간단한 문제이다. 

 

이 문제에서는 듣도 못한 사람의 수 n, 그리고 보도 못한 사람의 수 m이 주어진다. 그리고 그다음 n 줄 만큼의 사람의 이름이 주어지고 m 줄 만큼의 사람의 이름들이 주어진다. 듣도 못한 사람이기도 하고 보도 못한 사람이 이 문제에서 찾는 듣보잡이다. 

 

이 문제는 우선 HashMap을 이용해서 푼다. Key는 String, Value는 Integer로 한다. Key는 사람의 이름을 저장할 것이고, Value로는 이 사람이 Map에 들어간 횟수를 저장할 것이다. 그리고 입력으로 듣도 못한 사람들의 이름이 주어질 때 이 HashMap에 Value는 1로 저장한다. 그리고 보도 못한 사람들의 이름을 입력으로 받을 때 그 사람이 Map에 이미 들어있으면 Value는 2로 수정하고 없으면 Value 1로 그대로 Map에 넣는다.

 

이 문제에서는 getOrDefault (Object Key, V defaultValue)라는 함수를 이용할 것이다. getOrDefault 함수는 찾는 키가 맵에 있으면 찾는 키의 값을 반환하고 없으면 기본 값을 반환하는 함수이다. 이 함수는 맵을 이용할 때 자주 사용하는 메서드이기 때문에 꼭 알아두는 것이 좋다. 

 

getOrDefault (Object Key, V defaultValue)

이 함수에는 2개의 매개변수가 있다. 우선 Object Key는 값을 가지고 와야 하는 요소의 키다. 즉, 이 문제에서는 사람의 이름이 되겠다. 그리고 defaultValue는 지정된 키로 매핑된 값이 없는 경우 반환되어야 하는 기본값이다. 이 함수의 사용법은 밑에 있는 코드를 참고하면 되겠다.

여기까지 왔으면 듣도 못한 사람의 이름, 그리고 보도 못한 사람의 이름을 HashMap에 넣었다. 그리고 듣도 보도 못한 사람은 이 맵에서 값이 2이다. 값이 2인 사람들은 ArrayList에 넣어주고 오름차순으로 정렬을 하고 출력만 하면 된다.

 

이제 이 문제에서 주어진 예제를 한번 보겠다. 이 예제에서는 듣도 못한 사람 3명, 그리고 보도 못한 사람 4명이 다음과 같이 있다.

 

듣도 못한 사람 : ohhenrie, charlie, baesangwook

보도 못한 사람 : obama, baesangwook, ohhenrie, clinton

 

듣도 보도 못한 사람은 ohhenrie와 baesangwook 총 2명이다. 

 


  • 코드

 

import java.io.*;
import java.util.*;
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        Map<String, Integer> map = new HashMap<>();
        List<String> list = new ArrayList<>();
        StringTokenizer st = new StringTokenizer(br.readLine());
        int n = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(st.nextToken());
        for (int i = 0; i < n; i++) {
            map.put(br.readLine(), 1);
        }
        for (int i = 0; i < m; i++) {
            String name = br.readLine();
            map.put(name, map.getOrDefault(name,0) +  1);
            if (map.get(name) == 2) list.add(name);
        }
        StringBuilder sb = new StringBuilder();
        Collections.sort(list);
        sb.append(list.size() + "\n");
        for (String s : list) {
            sb.append(s + "\n");
        }
        System.out.print(sb);
    }
}

 


  • 후기

비록 자료구조도 이용하고 정렬도 해야 하는 문제였지만 되게 정직한 문제였던 거 같다.

 

반응형

댓글