728x90
반응형
1. 문제
https://www.acmicpc.net/problem/2493
2. 접근 및 해결
2-1) 접근
Stack이 pop되면서 변경되는 index를 처리하기 위해 Top이라는 객체를 만들어줬습니다.
이렇게 객체로 만들지 않으면, 스택이 pop되면서 현재 index위치를 잃어버리게 됩니다.
이 객체를 만들기 전에는 이중 for문으로 처리했었는데, 그럼 시간초과에서 벗어날 수가 없어서 채용했습니다..
class Top {
int index;
int height;
Top(int index, int height) {
this.index = index;
this.height = height;
}
int getIndex() {
return this.index;
}
int getHeight(){
return this.height;
}
}
// main문
Stack<Top> stk = new Stack<Top>();
2-2) 해결
핵심 코드는 복잡하지 않습니다.
5
6 9 5 7 4 // int a = Integer.parseInt(st.nextToken());
백준 질문 게시판에서 발견한 힌트인
`지금 넣으려는 탑보다 낮은 탑은 영원히 필요없으므로 제거한다` 는 말을 보고 코드를 작성했습니다.
input으로 들어오는 값인 a와 스택의 가장 위에 있는 값(peek)을 비교해서
스택의 가장 위에 있는 값(peek) > a면 peek의 index값을 출력하도록 했습니다.
3. 코드(JAVA)
import java.util.*;
import java.io.*;
class Top {
int index;
int height;
Top(int index, int height) {
this.index = index;
this.height = height;
}
int getIndex() {
return this.index;
}
int getHeight(){
return this.height;
}
}
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));
Stack<Top> stk = new Stack<Top>();
StringBuilder sb = new StringBuilder();
int N = Integer.parseInt(br.readLine());
StringTokenizer st = new StringTokenizer(br.readLine());
for(int i=1; i<N+1; i++) {
int a = Integer.parseInt(st.nextToken());
boolean flag = false;
int stkSize = stk.size();
for(int j=0; j<stkSize; j++) {
if(stk.peek().getHeight() < a) { // `지금 넣으려는 탑(a)보다 낮은 탑(peek)은 영원히 필요없으므로 제거한다`
stk.pop();
} else {
flag = true;
break;
}
}
// 8보다 작은 탑을 다 삭제했는데도 stk에 값이 있으면(8보다 큰 탑 존재)
if(!stk.isEmpty() || flag) {
sb.append(Integer.toString(stk.peek().getIndex())).append(" ");
} else {
sb.append("0").append(" ");
}
stk.push(new Top(i, a));
}
bw.write(sb.toString());
br.close();
bw.close();
}
}
728x90
반응형
'Study > Algorithm' 카테고리의 다른 글
[BOJ] 백준 2206번: 벽 부수고 이동하기_자바(JAVA) (0) | 2024.02.20 |
---|---|
[BOJ] 백준 6198번: 옥상 정원 꾸미기_자바(JAVA) (1) | 2024.02.04 |
[BOJ] 백준 1874번: 스택 수열_자바(JAVA) (0) | 2024.02.04 |
[BOJ] 백준 3273번: 두수의 합_자바(JAVA) *정렬, 투포인터 이용하지 않고 풀기 (0) | 2024.02.02 |
[BOJ] 백준 1267번: 핸드폰 요금_자바(JAVA) (0) | 2024.02.01 |