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);
    }
}

댓글남기기