Playground/자바문제집

[백준] 1764번

미숫가루설탕많이 2023. 6. 16. 15:52

기존에 풀었던 방식은 HashMap에 먼저 '듣도 못한 사람'을 모두 넣어둔 다음, '보도 못한 사람'을 map에 넣어주면서 만약 map에 해당 키가 있으면 value를 증가시켜서 중복 검사를 했었다. 이렇게 중복된 애들을 ArrayList에 넣고 sort 함수로 정렬해서 return.

 

후에 자료구조를 공부하다 TreeSet을 사용하면 어떨까 생각이 들어 다시 풀어봤다. 그러면 sort 함수를 사용할 필요도 없고 애초에 '듣도 못한 사람'을 모두 HashSet에 넣어둔 다음, '보도 못한 사람'들을 입력하면서 조건문을 통해 TreeSet에 넣어주면 자동으로 오름차순 정렬되니까 바로 return 하면 되지 않을까?

 

 

 

 

맨처음 풀었던 HashMap + ArrayList + sort() 방식
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());
        Map<String, Integer> map = new HashMap<>();
        List<String> list = new ArrayList<>();
        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()).append("\n");
        
        for (String str : list) {
            sb.append(str).append("\n");
        }

        System.out.println(sb);
    }
}

 

 

 

 

HashSet + TreeSet 으로 푼 방식
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());

        Set<String> set = new HashSet<>();
        while (N-- > 0) {
            set.add(br.readLine());
        }

        Set<String> answer = new TreeSet<>();
        while (M-- > 0) {
            String temp = br.readLine();

            if (set.contains(temp))
                answer.add(temp);
        }

        StringBuilder sb = new StringBuilder();
        sb.append(answer.size()).append('\n');
        for (String s : answer) {
            sb.append(s).append('\n');
        }

        System.out.println(sb);
    }
}

 

 

 

 

결과

 

제출 번호 61188947 - 기존에 풀었던 방식

제출 번호 62145242 - TreeSet으로 푼 방식

 

 

코드 길이도 줄고 메모리도 덜 사용한다.

'Playground > 자바문제집' 카테고리의 다른 글

[백준] 11123번  (0) 2023.06.25
[백준] 1817번  (0) 2023.06.24
[백준] 5430번  (2) 2023.06.09
[백준] 1049번  (0) 2023.05.23
[백준] 14469번  (0) 2023.05.22