[백준][17298번] 오큰수
Updated:
시간초과 코드
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));
StringBuilder sb = new StringBuilder();
int size = Integer.parseInt(br.readLine());
Stack<Integer> st = new Stack<>();
String[] str = br.readLine().split("\\s");
for(int i=size-1; i>=0; i--){
int num = Integer.parseInt(str[i]);
while(!st.empty()){
if(num < st.peek()){
sb.insert(0,st.peek()+" ");
st.push(num);
break;
}else{
st.pop();
}
}
if(st.empty()){
sb.insert(0,-1+" ");
st.push(num);
}
}
System.out.println(sb);
}
}
시간초과 해결 코드
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());
Stack<Integer> answer = new Stack<>();
Stack<Integer> st = new Stack<>();
String[] str = br.readLine().split(" ");
for(int i=size-1; i>=0; i--){
int num = Integer.parseInt(str[i]);
while(!st.empty()){
if(num < st.peek()){
answer.push(st.peek());
st.push(num);
break;
}else{
st.pop();
}
}
if(st.empty()){
answer.push(-1);
st.push(num);
}
}
while(!answer.empty()){
bw.write(answer.pop()+" ");
}
bw.flush();
}
}
다른 풀이
import java.util.*;
import java.io.*;
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());
int[] a = new int[n];
int[] ans = new int[n];
String[] temp = bf.readLine().split(" ");
for (int i=0; i<n; i++) {
a[i] = Integer.parseInt(temp[i]);
}
Stack<Integer> s = new Stack<>();
s.push(0);
for (int i=1; i<n; i++) {
if (s.isEmpty()) {
s.push(i);
}
while (!s.isEmpty() && a[s.peek()] < a[i]) {
ans[s.pop()] = a[i];
}
s.push(i);
}
while (!s.empty()) {
ans[s.pop()] = -1;
}
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
for (int i=0; i<n; i++) {
bw.write(ans[i] + " ");
}
bw.write("\n");
bw.flush();
}
}
느낀점
다른사람의 풀이와 내 풀이방식이 달랐지만 복잡도가 같았다.
하지만 내 풀이만 시간초과가 났다.
몇시간동안 그 원인을 분석해본 결과
원인은 ‘StringBuilder’의 insert()를 써서 맨앞에 추가할때 시간복잡도가 O(n2)가 되며 성능 저하 가 발생한 것이였다.
출처: stackoverflow / https://stackoverflow.com/questions/5931261/java-use-stringbuilder-to-insert-at-the-beginning
해결법
(위 코드 참조)
stack에 추가한다음 마지막에 BufferedWriter을 이용하여 출력했다.
Leave a comment