[백준] 10816번: 숫자 카드 2

ByWindow·2021년 10월 3일
0

Algorithm

목록 보기
61/104
post-thumbnail

📝문제

문제를 보자마자 숫자카드의 수를 key로 갖는 HashMap을 만들면 쉽게 풀 수 있을 것이라 생각했다.
하지만 계속 시간초과가 발생했다.
배열을 만드는 방법으로 해도 시간초과가 날 것이라는 생각에 HashMap을 사용하는 풀이에서 어떻게 시간을 줄일 수 있을지에 대해 고민했다.

1. getOrDefault
처음에는 숫자카드 키값을 입력 받을 때, 조건문을 통해 이미 입력받았다면 +1, 없다면 1을 하는 방식으로 했었다. 이것을 하나의 코드 getOrDefault로 줄였다

2. StringBuilder
나는 지금까지 사용하기 귀찮음에, 그리고 시간이 얼마나 줄여지겠나...하는 생각으로 StringBuilder를 사용하지 않고 있었다. 하지만 이 문제는 입력 받는 m의 크기만큼 숫자를 출력해야되고, 반복문 안에 System.out.print문이 있다면 시간이 많이 소요될 것이라는 생각이 들었다. 그래서 StringBuilder를 사용했다.

이 두가지를 사용하여 코드를 수정하니 통과할 수 있었다.
근데 내가 한번 생각했었던 풀이(길이가 20,000,001인 배열을 사용하는 방법)로 푸는게 더 시간이 적게 걸린다;; 이번에 카카오 코테에 hashmap으로 푸는 문제 나왔던데 공부한 셈 치지 뭐...

📌코드

package Baekjoon;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.StringTokenizer;

public class BOJ10816 {

    public static void main(String[] args) throws IOException {
        HashMap<Integer, Integer> hm = new HashMap<>();
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        StringTokenizer st = new StringTokenizer(br.readLine());
        for(int i = 0; i < n; i++){
            int cur = Integer.parseInt(st.nextToken());
            hm.put(cur, hm.getOrDefault(cur, 0) + 1);
        }
        int m = Integer.parseInt(br.readLine());
        st = new StringTokenizer(br.readLine());
        StringBuilder sb = new StringBuilder();
        for(int i = 0; i < m; i++){
            int cur = Integer.parseInt(st.nextToken());
            sb.append(hm.getOrDefault(cur, 0)).append(" ");
        }
        System.out.println(sb);
    }
}
profile
step by step...my devlog

0개의 댓글