일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- Data Structure
- 다이나믹 프로그래밍
- TypeScript
- db
- java
- CS
- 백준
- Algorithm
- Javascript
- 그레이들
- DP
- react
- vscode
- frontend
- network
- Graph
- LeetCode
- 안드로이드
- 리트코드
- Redux
- git
- BFS
- VIM
- 프로그래머스
- DFS
- Python
- Database
- 자바
- 알고리즘
- 동적 계획법
Archives
- Today
- Total
늘 겸손하게
백준 10816 - 숫자 카드 2 ( Java ) 본문
안녕하세요 besforyou입니다
이번 글에서는 백준 문제 10816 숫자 카드 2번 풀이를 소개하겠습니다
문제 해설
N개의 숫자 카드가 먼저 주어지고 M개의 숫자가 주어지는데 N개의 숫자카드 중에서 주어진 숫자와 같은 숫자가 적힌 숫자 카드가 몇 개 있는지 찾는 문제이다.
문제 풀이
단순하게 N개의 숫자 카드를 배열에 저장하고, M개의 숫자가 주어질때마다 배열을 순차 검색해서 같은 숫자의 개수를 세는 방식은 시간 초과가 나온다.
N개의 숫자카드가 주어지고 M개의 숫자가 주어질때 순차 검색으로 문제를 푸는 알고리즘의 시간 복잡도는 O(NM)이다.
1 <= N <= 500,000 , 1 <= M <= 500,000 이므로 매우 많은 시간이 걸릴 수 밖에 없다.
많은 데이터를 빠르게 처리해야하므로 순차 검색으로 탐색하지 말고 해쉬 맵을 사용하자.
해쉬 맵을 이용 하면 탐색하는데 드는 시간이 O(N)에서 O(logN)으로 줄어드므로 매우 효율적으로 데이터를 탐색할 수 있다.
코드
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
35
36
37
38
39
40
41
42
43
44
45
|
import java.util.Map;
import java.util.HashMap;
import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Main {
public static int N, M;
public static void main(String [] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine()); // N 값을 입력받는다.
String [] split = br.readLine().split(" "); // 2번째줄을 문자열로 읽고 " "을 기준으로 split. split 배열에는 각각의 숫자카드가 문자열 형식으로 저장되게 된다.
Map<Integer, Integer> map = new HashMap<>(N); // 길이가 N인 해쉬맵 생성
for ( int i = 0 ; i < N ; i++ ) {
int number = Integer.parseInt(split[i]); // 숫자카드 값을 정수형으로 파싱한다.
if (map.containsKey(number)) { // 해쉬 맵에 이미 숫자카드 값이 있다면,
map.replace(number, map.get(number) + 1); // value값을 1 증가시켜 덮어쓴다.
} else {
map.put(number, 1); // 해쉬 맵에 해당 값이 아직 저장된적이 없다면 새로운 key, value 쌍을 저장한다.
}
}
StringBuilder stb = new StringBuilder();
M = Integer.parseInt(br.readLine()); // M값을 읽는다.
split = br.readLine().split(" "); // 4번째 줄을 문자열로 읽고 " " 기준으로 split해서 저장
for ( int i = 0 ; i < M ; i++ ) {
int number = Integer.parseInt(split[i]); // 각 숫자를 파싱
if (map.containsKey(number)) { // 해쉬 맵에 해당 숫자가 존재하면
stb.append(map.get(number)); // 해당 숫자의 value를 문자열에 append
} else {
stb.append(0); // 해쉬 맵에 해당 숫자가 저장된적 없으면 0 append
}
stb.append(" ");
}
System.out.println(stb); // 정답
}
}
|
cs |
결과
'코딩 문제 > 백준' 카테고리의 다른 글
백준 10773 - 제로 ( Node.js ) (0) | 2021.12.01 |
---|---|
백준 1764 듣보잡 ( Java ) (0) | 2021.11.05 |
백준 11724 ( Java ) (0) | 2021.10.28 |
백준 - 1260 ( C++ ) DFS 와 BFS (0) | 2021.10.02 |
백준 2839 - 설탕 배달 ( C++ / Java ) (0) | 2021.09.26 |