백준 - 10816번: 숫자 카드 2

Lee·2023년 7월 15일
0

알고리즘

목록 보기
30/34
post-thumbnail

문제

숫자 카드는 정수 하나가 적혀져 있는 카드이다. 상근이는 숫자 카드 N개를 가지고 있다. 정수 M개가 주어졌을 때, 이 수가 적혀있는 숫자 카드를 상근이가 몇 개 가지고 있는지 구하는 프로그램을 작성하시오.

입력

첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10,000,000보다 작거나 같다.

셋째 줄에는 M(1 ≤ M ≤ 500,000)이 주어진다. 넷째 줄에는 상근이가 몇 개 가지고 있는 숫자 카드인지 구해야 할 M개의 정수가 주어지며, 이 수는 공백으로 구분되어져 있다. 이 수도 -10,000,000보다 크거나 같고, 10,000,000보다 작거나 같다.

출력

첫째 줄에 입력으로 주어진 M개의 수에 대해서, 각 수가 적힌 숫자 카드를 상근이가 몇 개 가지고 있는지를 공백으로 구분해 출력한다.

풀이

앞에서 풀었던 수 찾기와 동일하게 입력 과정이 주어진다. 다른점은 N개의 정수와 M개의 정수를 입력받고 정수 M이 N개의 정수 배열에서 몇 번 등장하는지를 체크하는 문제이다.

이진 탐색으로 풀 수 있겠지만, 개인적으로는 Map 클래스 안에 존재하는 getOrDefault 메소드를 활용해서 풀면 문제를 조금 더 쉽게 풀 수 있다고 판단하여 아래의 과정으로 진행했다.

이 과정을 순서대로 나열해보면

  1. N를 입력받는다.
  2. 키는 Integer, 값도 Integer 타입인 HashMap을 선언한다.
  3. 결과를 한꺼번에 출력하기 위해 StringBuilder 클래스도 선언한다.
  4. N개의 정수를 입력받으면서 HashMap에 getOrDefault 메소드를 사용하여 빈도수를 체크한다.
  5. M을 입력받는다.
  6. M의 크기 만큼 반복문을 순회하면서 HashMap에 해당 값이 존재하는지 확인한다.
  7. 있으면 빈도수를 출력 없으면 0을 출력

소스 코드

import java.io.*;
import java.util.*;

public class Main {

	static int N, M;
	static HashMap<Integer, Integer> map = new HashMap<>();
	static StringBuilder sb = new StringBuilder();

	public static void main(String[] args) throws Exception{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		N = Integer.parseInt(br.readLine());

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

		M = Integer.parseInt(br.readLine());

		st = new StringTokenizer(br.readLine());
		for (int i = 0; i < M; i++) {
			int value = Integer.parseInt(st.nextToken());
			if (map.containsKey(value)) {
				sb.append(map.get(value)).append(" ");
			} else {
				sb.append(0).append(" ");
			}
		}

		System.out.println(sb);
	}

}

0개의 댓글