43일차 백준 (kotlin -> java 5일차)
2493번 탑에서 발사한 신호 수신하기
못 풀었다, 스택으로 풀어야한다는 걸 알고도 못풀었다ㅠ_ㅠ
풀이 힌트를 얻어서 나만의 코드로 만들긴했지만… 아쉽다.
StringBuilder 쓰면 더 빨랐을텐데. 출력에서 느렸다.
StringBuilder sb = new StringBuilder();
for(int idx : receive) ans.append(idx).append(" ")
System.out.print(ans);
import java.util.*;
import java.io.*;
public class BJ_2493 {
public static class Tower {
int height;
int num;
Tower(int height, int num) {
this.height = height;
this.num = num;
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int[] receive = new int[n];
Stack<Tower> tower = new Stack<>();
StringTokenizer st = new StringTokenizer(br.readLine());
Tower nextTower;
for(int idx = 0; idx < n; idx++) {
nextTower = new Tower(Integer.parseInt(st.nextToken()), idx + 1);
while(true) {
//신호를 받아줄 탑이 없으면
if(tower.isEmpty()) {
receive[idx] = 0;
tower.push(nextTower);
break;
}
else {
if(tower.peek().height > nextTower.height) {
receive[idx] = tower.peek().num;
tower.push(nextTower);
break;
}
// 현재 탑의 높이보다 작다면 의미 없으므로 삭제.
else tower.pop();
}
}
}
for(int idx : receive) {
System.out.print(idx + " ");
}
}
}
굳이 Tower 클래스 안하고 앞선 타워의 인덱스를 기억하는법 없을까? -> 아 다른 사람들은 2개 요소를 가진 int 어레이를 선언했구나! 첫번째 요소가 높이고 두번째 요소가 탑 넘버군.
N = Integer.parseInt(br.readLine());
Deque<int[]> dq = new ArrayDeque<>();
dq.addLast(new int[]{100000001, 0});
StringTokenizer st = new StringTokenizer(br.readLine());
for(int i = 1; i <= N; i++) {
int height = Integer.parseInt(st.nextToken());
while(dq.peekLast()[0] < height) {
dq.pollLast();
}
System.out.print(dq.peekLast()[1] + " ");
dq.addLast(new int[]{height, i});
}
와 이 코드 짠 사람 짱이당 100_000_001 으로 첫요소 초기화해서 이런 코드를 짜다니 ㄷㄷ