728x90
https://www.acmicpc.net/problem/2493
2493번: 탑
첫째 줄에 탑의 수를 나타내는 정수 N이 주어진다. N은 1 이상 500,000 이하이다. 둘째 줄에는 N개의 탑들의 높이가 직선상에 놓인 순서대로 하나의 빈칸을 사이에 두고 주어진다. 탑들의 높이는 1
www.acmicpc.net
문제)
풀이)
솔직히 이 문제는 아주 헤맸다. 뭔가 쉬운듯 아닌듯...
뭔가 스택을 쓰면 될 것 같은데.. 하면서 이것저것 하다가 결국 포기하고 다시 보며 노력한 문제!
맨 처음에는 스택이 비어있으므로 stringbuilder인 sb에는 0 추가, stack에 push 한다.
그 이후부터는 탑의 높이를 입력 받으면서 stack의 맨 꼭대기에 존재하는 높이와 비교를 한다.
만약 입력받은 높이가 더 높다면, pop 시키고, 스택의 다음 원소와 비교한다.
이때, 스택 원소의 높이가 더 높을 경우, sb에 해당 원소의 인덱스를 삽입하고, 입력받은 원소는 stack에 push한다.
이를 반복하면 끝!
코드의 이해를 돕기 위해 입력에 따른 stack의 상태를 표현해봤다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Stack;
import java.util.StringTokenizer;
public class Main_BJ_2493_탑 {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
Stack<int[]> stack = new Stack<>();
StringBuilder sb = new StringBuilder();
st = new StringTokenizer(br.readLine());
for(int i=1; i<=n; i++) {
//새로운 높이 입력받음
int Height = Integer.parseInt(st.nextToken());
//스택에 비교대상이 있는지
while(!stack.empty()) {
//스택의 꼭대기 높이와 새로운 높이 비교
if(stack.peek()[1] > Height) {
//스택 꼭대기 높이가 더 높을 경우 꼭대기 인덱스 추가
sb.append(stack.peek()[0] + " ");
break;
}
// 새로운 높이가 더 높을 경우 pop
stack.pop();
}//while
//스택이 비어있을 때
if(stack.empty()) {
sb.append("0 ");
}
// 스택에 인덱스와 높이 넣기
stack.push(new int[] {i, Height});
}//for
System.out.println(sb);
}//main
}
처음에 Scanner를 썼는데, 메모리 초과가 나서 bufferedreader와 stringbuilder를 사용했다!
728x90
'코테 > 백준' 카테고리의 다른 글
백준 17070 파이프 옮기기 1(JAVA) (1) | 2022.09.30 |
---|---|
백준 1158 요세푸스 문제(JAVA) (0) | 2022.08.19 |
백준 12891. DNA 비밀번호(JAVA) (0) | 2022.08.16 |
백준 2164. 카드2(JAVA) (0) | 2022.08.16 |
백준 11660 구간 합 구하기 5(JAVA) (0) | 2022.08.09 |