728x90
※ 문제
1. 실패
1) 설계
- 우선 정확성을 고려하여 어떻게 코딩할 것인지 생각했다. 내가 생각한 로직은 이러하다.
-----반례-----
4
3 5 2 7
완전 탐색으로 순서대로 하나하나 전부 비교하는 것이었다.
결과는 '시간 초과'가 발생하였다.
2) 실패 코드
import java.io.*;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main {
static Queue<Integer> queue = new LinkedList<>();
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 N = Integer.parseInt(br.readLine());
StringTokenizer st = new StringTokenizer(br.readLine());
int[] arr = new int[N];
for(int i=0; i<N; i++) {
int num = Integer.valueOf(st.nextToken());
queue.offer(num);
arr[i] = num;
}
int i = 0;
int repeatCnt = 1;
while(!queue.isEmpty()) {
int queNum = queue.poll();
boolean minOneSe = true;
i = repeatCnt;
while(i < N) {
if(queNum < arr[i]) {
bw.write(arr[i]+" ");
minOneSe = false;
break;
}
i++;
}
repeatCnt++;
if(minOneSe) bw.write(-1+" ");
}
bw.flush();
bw.close();
}
}
2. 성공
1) 설계
- 완전 탐색으로 이중 for문을 사용하면 '시간 초과'가 발생하기 때문에 반복문 하나로 해결할 수 있는 방법을 생각했다.
실패 로직과 반대로 뒤에서부터 비교해보려 했다.
먼저,
가로 ①. 7은 가장 오른쪽에 있기 때문에 비교 값이 존재하지 않는다. 이 경우 결과 스택에 -1을 push 하고 임시 스택에 7을 push 한다.
가로 ②. 2는 임시 스택에 있는 7과 비교한 후 결과스택에 push 하고 임시 스택에 2를 push 한다.
가로 ③. 5는 임시 스택에 2보다 크기 때문에 2는 pop 해서 제거해준다.
가로 ④. 5와 7 비교 후 결과 스택에 push 하고 임시 스택에 5를 push 한다.
가로 ⑤. 3과 5 비교 후 결과 스택에 push 한다.
가로 ⑥. 결과를 다 구했으므로 break; 종료한다.
2) 성공코드
import java.io.*;
import java.util.Stack;
import java.util.StringTokenizer;
public class Main {
static Stack<Integer> stack = new Stack<>();
static Stack<Integer> resultStack = new Stack<>();
static Stack<Integer> tempStack = new Stack<>();
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 N = Integer.parseInt(br.readLine());
StringTokenizer st = new StringTokenizer(br.readLine());
while(N --> 0) {
stack.push(Integer.valueOf(st.nextToken()));
}
int idx = 0;
while(!stack.isEmpty()) {
int temp = stack.pop();
if(idx == 0) { // 우측에 값이 없기 때문에 -1
tempStack.push(temp);
resultStack.push(-1);
} else if(!tempStack.isEmpty() && temp <= tempStack.peek()) {
resultStack.push(tempStack.peek());
tempStack.push(temp);
} else {
if(tempStack.isEmpty()) {
resultStack.push(-1);
tempStack.push(temp);
} else {
tempStack.pop();
stack.push(temp);
}
}
idx++;
}
while(!resultStack.isEmpty()) {
bw.write(resultStack.pop() + " ");
}
bw.flush();
bw.close();
}
}
문제의 예제는 모두 통과하였으나 정확도의 이슈가 해결되지 않은 분은 아래 반례로 확인해보길 바란다.
※ 반례 모음
3
1 3 2
정답 : 3 -1 -1
3
2 1 2
정답 : -1 2 -1
3
1 2 3
정답 : 2 3 -1
3
3 2 1
정답 : -1 -1 -1
728x90
'자기계발 > 백준 문제 풀이' 카테고리의 다른 글
1918 자바 ] 후위 표기식(풀이) (0) | 2022.09.13 |
---|---|
17299 자바 ] 오등큰수(풀이) (0) | 2022.09.10 |
1406 자바 ] 에디터(풀이) (0) | 2022.09.01 |
7568 자바 ] 덩치(풀이) (0) | 2022.09.01 |
1009 자바 ] 분산처리(풀이) (0) | 2022.09.01 |