1 minute read




문제 풀이


이번 문제는 이전에 풀었던 숫자 카드 문제에서 확장된 문제이다.
이분탐색을 활용해 푸는 대표적 방법도 있겠지만, 아직 이분 탐색에 대해서 제대로 공부가 되지 않아 HashMap을 활용해 풀어보았다.


아이디어 도출

  • 입력으로 받는 N개의 숫자 카드를 나온 횟수별로 HashMap에 숫자카드를 key값으로, 횟수를 value값으로 쌓는다.
  • M개의 숫자 카드를 입력받으며 HashMap에 존재하는 값이라면 HashMap의 value값인 횟수를 가져온다.

아이디어는 간단하다.
N개의 카드를 HashMap에 중복 카드든 아니든 모두 횟수별로 쌓아두고, M개의 카드들이 HashMap에 존재하는 카드인지 확인하여 value값을 가져오면 된다.


바로 코드를 작성해보자.

1
2
3
4
5
6
7
8
int N = Integer.parseInt(br.readLine());
HashMap<Integer, Integer> hm = new HashMap<>();

StringTokenizer st = new StringTokenizer(br.readLine());
for(int i=0; i<N; i++) {
    int num = Integer.parseInt(st.nextToken());
    hm.put(num, hm.getOrDefault(num, 0)+1);
}

먼저 N을 입력받고 N개의 카드를 횟수별로 쌓아둘 HashMap을 하나 만들자.
그리고 공백을 두고 N개의 카드를 입력받으면서 HashMap에 숫자카드를 key값으로 숫자카드 출몰횟수를 value값으로 저장해간다.
출몰횟수의 경우 getOrDefault() 메서드를 사용하여 기존에 값을 가져와 카운트를 증가하여 다시 저장하도록 하였다.

1
2
3
4
5
6
7
8
9
10
11
int M = Integer.parseInt(br.readLine());
st = new StringTokenizer(br.readLine());

StringBuilder sb = new StringBuilder();
for(int i=0; i<M; i++) {
    int n = Integer.parseInt(st.nextToken());
    if(hm.get(n) == null) sb.append("0").append(" ");
    else sb.append(hm.get(n)).append(" ");
}

bw.write(sb.toString()+"\n");

다음으로 M을 입력받고 M개의 카드를 입력받으며 HashMap에 key값으로 존재하는지를 확인한다.
만약 null이라면 한번도 나오지 않은 카드이기에 “0”을 출력하고, key값이 있다면 입력받은 M번째 카드를 key로 부여하여 HashMap의 value값인 횟수를 가져오면 된다.



작성코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import java.io.*;
import java.util.*;

class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        int N = Integer.parseInt(br.readLine());
        HashMap<Integer, Integer> hm = new HashMap<>();
        
        StringTokenizer st = new StringTokenizer(br.readLine());
        for(int i=0; i<N; i++) {
            int num = Integer.parseInt(st.nextToken());
            hm.put(num, hm.getOrDefault(num, 0)+1);
        }

        int M = Integer.parseInt(br.readLine());
        st = new StringTokenizer(br.readLine());

        StringBuilder sb = new StringBuilder();
        for(int i=0; i<M; i++) {
            int n = Integer.parseInt(st.nextToken());
            if(hm.get(n) == null) sb.append("0").append(" ");
            else sb.append(hm.get(n)).append(" ");
        }
        
        bw.write(sb.toString()+"\n");

        bw.flush();
        bw.close();
        br.close();
    }   
}

회고

  • HashMap에 카운트를 세어 저장해두고, 카운트 값을 가져올 수 있는 아이디어를 생각해볼 수 있었다.