[백준][17299번] 오등큰수

Updated:

나의 풀이

package backjoon;

import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        int size = Integer.parseInt(br.readLine());
        int[] a = new int[size]; // input
        int[] ans = new int[size]; // 답
        Stack<Integer> st = new Stack<>();
        StringTokenizer str = new StringTokenizer(br.readLine());
        Map<Integer, Integer> m = new HashMap<>(); // 빈도수

        for(int i=0; i<size; i++)
            a[i] = Integer.parseInt(str.nextToken());

        for(int i=0; i<size; i++)
            m.put(a[i], m.getOrDefault(a[i], 0)+1);

        st.push(0);
        for(int i=1; i<size; i++){
            //빈도수가 더 높으면
            while(!st.empty() && m.get(a[st.peek()]) < m.get(a[i])) {
                    ans[st.pop()] = a[i];
            }
            st.push(i);
        }

        //스택에 남은 원소 위치에 -1저장
        while(!st.empty())
            ans[st.pop()] = -1;

        for(int b : ans)
            bw.write(b+" ");

        bw.flush();
    }
}

느낀점

빈칸 기준으로 String을 쪼개는 방식으로 두가지 방법을 사용해봤다.

1) String의 split() 메서드를 활용 (1740ms) 2) StringTokenizer 사용 (1468ms)

StringTokenizer사용 하는편이 약 300ms가량 빨라지는 것을 깨달았다! Imgur

Leave a comment