Baekjoon 문제 풀기 (10816번 : 숫자 카드 2) Java
10816번 : 숫자 카드 2
1. 문제읽기
count 하는 문제
입력되는 카드 하나씩 몇개를 가지고 있는지 출력하면 된다.
아무것도 가지고 있지 않다면 0을 출력한다.
2. 제출 코드
시간초과로 실패했다.
HashMap을 사용하여 같은 숫자가 있다면 +1을 해줘서 카운트를 올린다.
시간초과가 된 이유는 이중 for문을 사용했기 때문에 당연한 결과..
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(bf.readLine());
Map<Integer,Integer> map = new HashMap<>();
StringTokenizer st = new StringTokenizer(bf.readLine());
for(int i = 0; i < n; i++) {
int num = Integer.parseInt(st.nextToken());
if(map.get(num)==null) {
map.put(num,1);
} else {
map.put(num,map.get(num)+1);
}
}
int m = Integer.parseInt(bf.readLine());
int[] arr = new int[m];
st = new StringTokenizer(bf.readLine());
for(int i = 0; i < m; i++) {
int num = Integer.parseInt(st.nextToken());
for(int key : map.keySet()) {
if(num == key) {
arr[i] = map.get(key);
break;
}
}
}
StringBuilder sb = new StringBuilder();
for(int i : arr) {
sb.append(i).append(" ");
}
System.out.println(sb);
}
}
3. 공부할 것
이진탐색 방법으로는 이해하기 너무 어려워서 패스했다.
getOrDefault
메소드를 사용하면 동일한 로직으로 시간초과가 나지 않게 풀 수 있었다.
찾는 키가 존재한다면 찾는 키의 값을 반환하고, 없다면 기본값을 반환한다.
getOrDefault(Object key, DefaultValue)
if문과 forEach문을 getOrDefault 메소드로 바꿔주면 간단히 해결된다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(bf.readLine());
Map<Integer,Integer> map = new HashMap<>();
StringTokenizer st = new StringTokenizer(bf.readLine());
for(int i = 0; i < n; i++) {
int num = Integer.parseInt(st.nextToken());
map.put(num,map.getOrDefault(num, 0)+1);
}
int m = Integer.parseInt(bf.readLine());
int[] arr = new int[m];
st = new StringTokenizer(bf.readLine());
StringBuilder sb = new StringBuilder();
for(int i = 0; i < m; i++) {
int num = Integer.parseInt(st.nextToken());
sb.append(map.getOrDefault(num, 0)).append(" ");
}
System.out.println(sb);
}
}
댓글남기기