Coding Test
25. Baekjoon Gold5 2493. '탑'
Daen12
2023. 7. 22. 18:47
https://www.acmicpc.net/problem/2493
2493번: 탑
첫째 줄에 탑의 수를 나타내는 정수 N이 주어진다. N은 1 이상 500,000 이하이다. 둘째 줄에는 N개의 탑들의 높이가 직선상에 놓인 순서대로 하나의 빈칸을 사이에 두고 주어진다. 탑들의 높이는 1
www.acmicpc.net
처음에는 배열과 while문을 사용해서 이전 탑 높이에 따라 조건처리를 해주는 방식으로 풀었다.
그런데 채점 결과 시간초과가 나왔다.
- 시도 1
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Scanner;
import java.util.Stack;
import java.util.StringTokenizer;
public class Q2493_탑_gold5 {
// 6,9,5,7,4
// 왼쪽 <-으로 발사
// 어느 탑에서 수신하는지
public static void main(String[] args) throws IOException {
StringBuilder sb = new StringBuilder();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
Scanner in = new Scanner(System.in);
Stack<Integer> number = new Stack<>();
Stack<Integer> index = new Stack<>();
int N = Integer.parseInt(st.nextToken());
StringTokenizer st2 = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st2.nextToken());// 6
number.push(n);// 1
index.push(1);
sb.append(0 + " ");
for (int i = 2; i <= N; i++) {
int val = Integer.parseInt(st2.nextToken());// 4
while (!number.isEmpty()) {
if (val < number.peek()) {
sb.append(index.peek() + " ");
break;
}
number.pop(); // 어차피 더 큰 탑이 오른쪽에 존재 = 왼쪽 작은탑은 pop해도 무방함.
index.pop();
}
if (number.isEmpty()) {
sb.append(0 + " ");
}
number.push(val);// 9 7 (여기서 꺼냄)
index.push(i);// 2 4
}
System.out.println(sb.toString());
}
}
두번째 시도 방법은 스택 사용!
비교 탑보다 큰 숫자들만 있는 스택, 그리고 인덱스 스택 두개를 만들어 준 후
왼쪽에 위치하는 작은 탑은 pop() 하는 방식으로 순서대로 인덱스를 찾아주었다.
- 시도 2
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Scanner;
import java.util.Stack;
import java.util.StringTokenizer;
public class Q2493_탑_gold5 {
// 6,9,5,7,4
// 왼쪽 <-으로 발사
// 어느 탑에서 수신하는지
public static void main(String[] args) throws IOException {
StringBuilder sb = new StringBuilder();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
Scanner in = new Scanner(System.in);
Stack<Integer> number = new Stack<>();
Stack<Integer> index = new Stack<>();
int N = Integer.parseInt(st.nextToken());
StringTokenizer st2 = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st2.nextToken());// 6
number.push(n);// 1
index.push(1);
sb.append(0 + " ");
for (int i = 2; i <= N; i++) {
int val = Integer.parseInt(st2.nextToken());// 4
while (!number.isEmpty()) {
if (val < number.peek()) {
sb.append(index.peek() + " ");
break;
}
number.pop(); // 어차피 더 큰 탑이 오른쪽에 존재 = 왼쪽 작은탑은 pop해도 무방함.
index.pop();
}
if (number.isEmpty()) {
sb.append(0 + " ");
}
number.push(val);// 9 7 (여기서 꺼냄)
index.push(i);// 2 4
}
System.out.println(sb.toString());
}
}
통과!