문제
풀이
해시맵을 사용한 방법 또는 이분 탐색을 이용한 방법 2가지로 풀이할 수 있다.
1. 해시맵 사용
카드와 그 카드의 개수를 각각 키와 값으로 가진 해시맵을 사용한다.
if(hm.containsKey(input))
hm.put(input, hm.get(input)+1);
else
hm.put(input, 1);
입력된 숫자가 해시맵에 존재하지 않을 경우(=처음으로 등장한 카드일 경우) 지금까지 한 장 등장한 것이므로 해시맵에 <n, 1>을 삽입하고, 입력된 숫자가 해시맵에 이전에 삽입된 적 있는 숫자일 경우 이전보다 한 장 더 등장한 것이므로 (n, (지금까지 해당 카드 개수)+1)을 삽입한다.
if(hm.containsKey(input))
sb.append(hm.get(input)+" ");
else
sb.append(0+" ");
이후 해시맵에서 원하는 카드의 장수를 찾아 출력하면 된다.
전체 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
HashMap<Integer, Integer> hm=new HashMap<>();
StringBuilder sb=new StringBuilder();
int N=Integer.parseInt(br.readLine());
StringTokenizer st=new StringTokenizer(br.readLine());
for(int i=0; i<N; i++) {
int input=Integer.parseInt(st.nextToken());
if(hm.containsKey(input))
hm.put(input, hm.get(input)+1);
else
hm.put(input, 1);
}
int M=Integer.parseInt(br.readLine());
st=new StringTokenizer(br.readLine());
for(int i=0; i<M; i++) {
int input=Integer.parseInt(st.nextToken());
if(hm.containsKey(input))
sb.append(hm.get(input)+" ");
else
sb.append(0+" ");
}
System.out.println(sb);
}
}
2. 이분 탐색을 활용한 방법
이분 탐색으로 n이 처음 등장하는 인덱스와 마지막으로 등장하는 인덱스를 찾아 이 둘의 차를 구하는 방식이다.
전체 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
HashMap<Integer, Integer> hm=new HashMap<>();
StringBuilder sb=new StringBuilder();
int N=Integer.parseInt(br.readLine());
StringTokenizer st=new StringTokenizer(br.readLine());
for(int i=0; i<N; i++) {
int input=Integer.parseInt(st.nextToken());
if(hm.containsKey(input))
hm.put(input, hm.get(input)+1);
else
hm.put(input, 1);
}
int M=Integer.parseInt(br.readLine());
st=new StringTokenizer(br.readLine());
for(int i=0; i<M; i++) {
int input=Integer.parseInt(st.nextToken());
if(hm.containsKey(input))
sb.append(hm.get(input)+" ");
else
sb.append(0+" ");
}
System.out.println(sb);
}
}
이분 탐색(위)보다 해시맵(아래)가 조금 더 빠른 듯 하다.
'백준' 카테고리의 다른 글
11659: 구간 합 구하기 4(java) (0) | 2024.09.02 |
---|---|
백준 3477: 버그왕(java) (0) | 2024.08.31 |
백준 31860: 열심히 일하는 중(java) (0) | 2024.08.25 |
백준 28107: 회전초밥(java) (0) | 2024.08.25 |
백준 11286: 절댓값 힙(java) (0) | 2024.08.24 |