java
백준 10816 숫자카드2 자바 java
MiaCoder
2024. 1. 23. 16:03
이번 문제의 어려웠던 점은 HashMap의 키는 중복된 값을 허용하지 않는다는 점이다.
따라서 HashMap에 바로 값을 넣을수는 없다.
그렇다면 HashMap의 특성을 이용하여 중복되는 수를 세보자.
HashMap는 중복된 키가 입력되면 오류가 나는 것이 아닌 해당 키가 업데이트된다.
만약 (A, 10)이 있었다면 (A, 5)가 들어오면 (A, 5)로 해당 value가 업데이트된다.
그렇다면 동일한 키가 들어올 때 마다 기존 value에 + 1을 하면 중복된 키의 개수를 셀 수 있을 것이다.
이 특성을 바탕으로 코드를 작성해 보자.
import java.util.*;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
HashMap<Integer, Integer> map = new HashMap<>();
StringTokenizer st;
st = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++) {
String read = st.nextToken();
int readI = Integer.parseInt(read);
//nextToken은 String 타입으로 입력받으므로 타입 변환
if (map.get(readI) == null) {
map.put(readI, 1);
// 만약 HashMap에 해당하는 값이 없다면 해당 값을 추가하고 value에 1을 준다.
} else {
map.put(readI, map.get(Integer.parseInt(read)) + 1);
// 만약 HashMap에 해당 값이 있다면 해당 value + 1로 업데이트 한다.
}
}
int M = Integer.parseInt(br.readLine());
st = new StringTokenizer(br.readLine());
StringBuilder sb = new StringBuilder();
for (int i = 0; i < M; i++) {
String read = st.nextToken();
int readI = Integer.parseInt(read);
if (map.get(readI) != null) {
sb.append(map.get(readI) + " ");
} else {
sb.append(0 + " ");
}
//StringBuilder으로 붙여 출력한다.
}
System.out.print(sb);
br.close();
}
}