코딩 테스트/백준

[백준] 1764번: 듣보잡 (실버4, 자료 구조, 문자열, 정렬해시를 사용한 집합과 맵, JAVA)

Nirsa 2024. 1. 27. 10:51
반응형

 

문제 링크 : https://www.acmicpc.net/problem/1764

 

[백준] 1764번: 듣보잡 (실버4, 자료 구조, 문자열, 정렬해시를 사용한 집합과 맵, JAVA)

해당 문제는 N과 M의 중복 개수와 이름을 출력하는 문제입니다. (중복 개수 출력을 못봐서 두 개의 케이스로 풀었습니다..)

 

1. getOrDefault를 사용한 풀이

getOrDefault는 지정된 값을 찾아서 없다면 기본값을, 있다면 값에 1을 더하여 사용했습니다. map.put(name, map.getOrDefault(name,0) +  1);  으로 사용을 했는데 name값이 있다면 value를 1 증가 시키고 없다면 기본값(0)을 반환시키도록 하는 함수입니다.

보도 못한(M) 사람을 입력받고 해당하는 키가 있다면 값을 1 증가, 증가된 값이 2라면 중복되는 값이기 때문에 list에 넣습니다. 이후 Collections.sort를 사용하여 듣보잡 리스트(list)를 정렬시키고 list의 사이즈와 요소를 출력합니다.

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] input = br.readLine().split(" ");
        int N = Integer.parseInt(input[0]);
        int M = Integer.parseInt(input[1]);
        Map<String, Integer> map = new HashMap<>();
        List<String> list = new ArrayList<>();

        for (int i = 0; i < N; i++) {
            String name = br.readLine();
            map.put(name, 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);
            }
        }
        
        Collections.sort(list);
        System.out.println(list.size());
        for(String s : list) {
        	System.out.println(s);
        }
    }
}

 

2. containsKey를 사용한 풀이

containsKey는 해당하는 키가 있는지 확인해주는 함수입니다. 두번째 for문에서 containsKey를 사용하여 입력받은 값이 현재 map의 키에 있는지 확인하고, 있다면 names 리스트에 추가합니다.

이후 모두 구했다면 듣보잡은 names 리스트에 추가되어 있으므로 정렬 후 사이즈와 요소를 출력합니다. 

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] input = br.readLine().split(" ");
        int N = Integer.parseInt(input[0]);
        int M = Integer.parseInt(input[1]);
        Map<String, Integer> nameCountMap = new HashMap<>();
		List<String> names = new ArrayList<>();
        
        for (int i = 0; i < N; i++) {
            String name = br.readLine();
            nameCountMap.put(name, 0);
        }
        
        for (int i = 0; i < M; i++) {
            String name = br.readLine();
            if (nameCountMap.containsKey(name)) {
            	names.add(name);
            }
        }
        
        Collections.sort(names);
        System.out.println(names.size());
        for(String s : names) {
        	System.out.println(s);
        }
    }
}

 

반응형