티스토리 뷰
1. 문제
https://www.acmicpc.net/problem/2493
2493번: 탑
첫째 줄에 탑의 수를 나타내는 정수 N이 주어진다. N은 1 이상 500,000 이하이다. 둘째 줄에는 N개의 탑들의 높이가 직선상에 놓인 순서대로 하나의 빈칸을 사이에 두고 주어진다. 탑들의 높이는 1
www.acmicpc.net
2. 풀이
오른쪽에서 레이저를 쏘기 때문에 오른쪽으로 시작 할 수 있지만, 그렇게 하면 최악의 경우 N!의 복잡도가 발생할 수 있다. 따라서, stack을 활용해 오른쪽부터 계산한다. 풀이 과정은 아래와 같다.
- 탑의 위치와 높이를 스택에 모두 저장하기 위해 별도의 클래스를 만든다.
- 탑의 왼쪽부터 시작한다.
- while문을 이용해 stack에 있는 탑들을 돌아보며,
- 현재의 탑 높이가 스택의 가장 위에 있는 탑의 높이보다 같거나 작은 경우(= 현재 탑에서 쏜 레이저가 해당 탑에 맞을 수 있는 경우), 스택의 가장 위에 있는 탑의 위치를 답에 추가한다(sb.append())
- 탑들을 돌 때, 해당 현재 탑의 높이가 스택 가장 위에 있는 탑의 높이보다 큰 경우, 레이저를 수신할 수 없으므로 pop 한다.
- 스택이 비면, 레이저를 수신할 수 없으므로 0을 답에 추가한다.
- 해당 탑을 스택에 추가한다.
3. 코드
import java.util.Stack;
import java.io.*;
class top{
int pos; // 위치
int height; // 높이
public top(int pos, int height) {
this.pos = pos;
this.height = height;
}
}
public class Main {
public static void main (String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int n = Integer.parseInt(br.readLine());
String[] input = br.readLine().split(" ");
Stack<top> s = new Stack<top>();
for(int i = 1; i <= n; i++) {
int nowH = Integer.parseInt(input[i-1]); // 현재 탑 높이
while(!s.isEmpty()) {
// 해당 탑 높이가 스택에 가장 위에 있는 탑의 높이보다 같거나 작은 경우
if(s.peek().height >= nowH) {
sb.append(s.peek().pos + " "); // 해당 탑의 위치를 sb에 추가
break;
}
// 해당 탑 높이가 스택 가장 위에 있는 탑의 높이보다 큰 경우
s.pop();
}
if(s.isEmpty()) {
sb.append(0 + " "); // 레이저 못 맞음. 0을 sb에 추가
}
// 해당 탑 스택에 추가
s.push(new top(i, nowH));
}
System.out.println(sb.toString());
}
}
'알고리즘 > 백준' 카테고리의 다른 글
[JAVA/백트래킹] 백준 15686 치킨 배달 (0) | 2021.10.18 |
---|---|
[JAVA/DP] 백준 14501 퇴사 (0) | 2021.10.18 |
[JAVA/BFS] 백준 5014 스타트링크 (0) | 2021.10.11 |
[JAVA/BFS] 백준 2644 촌수계산 (0) | 2021.10.11 |
[JAVA/다익스트라] 백준 5719 거의 최단 경로 (0) | 2021.07.15 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 라즈비안
- 아두이노
- 키 순서
- the pads
- DP
- 구슬 탈출2
- 집배원 한상덕
- git
- ESP8266
- dht11
- 라즈베리파이
- BFS
- FTP
- 스티커모으기2
- 블루투스
- 백준
- java
- dovecot
- hc-06
- 메일서버
- c++
- hackerrank
- 11503
- mysql
- 프로그래머스
- 합승 택시 요금
- 자바
- 리눅스
- 2981
- 워드프레스
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
글 보관함