Notice
Recent Posts
Recent Comments
Link
- Today
- Total
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
Tags
- tomcat-users.xml
- DBeaver
- putty
- linux
- jenkins
- baekjoon
- 환경번수
- SVN
- boj
- 제수가 0입니다
- jsonb select
- ora-01476
- Rocky Linux 9
- 백준 JAVA
- 서버 접근
- 메뉴얼
- rocky linux
- bekjoon
- 백준
- PostgreSQL
- available plugins
- java
- javascript
- 사용법
- poll scm
- 자바
- subversion
- 백준 java jaekjoon JAVA
- 1773번
- jaekjoon java
Archives
기록하는 개발자
[백준 2493번] 탑 - JAVA 알고리즘 본문
2493번 |
문제 | |
KOI 통신연구소는 레이저를 이용한 새로운 비밀 통신 시스템 개발을 위한 실험을 하고 있다. 실험을 위하여 일직선 위에 N개의 높이가 서로 다른 탑을 수평 직선의 왼쪽부터 오른쪽 방향으로 차례로 세우고, 각 탑의 꼭대기에 레이저 송신기를 설치하였다. 모든 탑의 레이저 송신기는 레이저 신호를 지표면과 평행하게 수평 직선의 왼쪽 방향으로 발사하고, 탑의 기둥 모두에는 레이저 신호를 수신하는 장치가 설치되어 있다. 하나의 탑에서 발사된 레이저 신호는 가장 먼저 만나는 단 하나의 탑에서만 수신이 가능하다. 예를 들어 높이가 6, 9, 5, 7, 4인 다섯 개의 탑이 수평 직선에 일렬로 서 있고, 모든 탑에서는 주어진 탑 순서의 반대 방향(왼쪽 방향)으로 동시에 레이저 신호를 발사한다고 하자. 그러면, 높이가 4인 다섯 번째 탑에서 발사한 레이저 신호는 높이가 7인 네 번째 탑이 수신을 하고, 높이가 7인 네 번째 탑의 신호는 높이가 9인 두 번째 탑이, 높이가 5인 세 번째 탑의 신호도 높이가 9인 두 번째 탑이 수신을 한다. 높이가 9인 두 번째 탑과 높이가 6인 첫 번째 탑이 보낸 레이저 신호는 어떤 탑에서도 수신을 하지 못한다. 탑들의 개수 N과 탑들의 높이가 주어질 때, 각각의 탑에서 발사한 레이저 신호를 어느 탑에서 수신하는지를 알아내는 프로그램을 작성하라. |
|
입력 | |
첫째 줄에 탑의 수를 나타내는 정수 N이 주어진다. N은 1 이상 500,000 이하이다. 둘째 줄에는 N개의 탑들의 높이가 직선상에 놓인 순서대로 하나의 빈칸을 사이에 두고 주어진다. 탑들의 높이는 1 이상 100,000,000 이하의 정수이다. | |
출력 | |
첫째 줄에 주어진 탑들의 순서대로 각각의 탑들에서 발사한 레이저 신호를 수신한 탑들의 번호를 하나의 빈칸을 사이에 두고 출력한다. 만약 레이저 신호를 수신하는 탑이 존재하지 않으면 0을 출력한다. | |
예제 입력 | 예제 출력 |
5 6 9 5 7 4 |
0 0 2 2 4 |
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Stack;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // 선언
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); // 선언
//==========1. 탑의 크기와 목록을 가져온다.=========
int N = Integer.parseInt(br.readLine()); //탑 개수
int[] tower = new int[N]; //탑 배열
StringTokenizer st = new StringTokenizer(br.readLine());
for(int i = 0; i < N; i++) tower[i] = Integer.parseInt(st.nextToken()); //탑 저장
//==========2. 이중 for문은 시간 제한.. stack 이용=========
Stack<int[]> stack = new Stack<>();
for(int i = 0; i < N; i++) { // 탑 만큼 반복
while(!stack.empty()) { //스텍에 값이 있을때
if(stack.peek()[1]<tower[i]) { //현재 탑 높이가 더 높으면 기존의 정보는 삭제한다.
stack.pop();
}
else {//현재 탑이 더 작으면 이전 탑 위치 저장
bw.write(stack.peek()[0]+" ");
break;
}
}
if(stack.isEmpty()) bw.write("0 "); //탑 위치 정보가 비어있다면 0을 출력한다.
stack.push(new int[] {i+1, tower[i]}); //[0] 타워 순번 저장, [1] 타워 높이 저장
}
bw.close();
br.close();
}
}
더보기
다중for문을 사용했다가 시간초과 오류가 발생했습니다..
stack의 사용법이 기억나지 않아서 아래 글을 참고했습니다.
개인적으로 정리한 내용을 간단하게 풀어 작성했습니다. 이해가 안가는 부분은 댓글 남겨주시면 설명해드리겠습니다. |
'Baekjoon Online Judge' 카테고리의 다른 글
[백준 2609번] 최대공약수와 최소공배수 - JAVA 알고리즘 (0) | 2022.04.08 |
---|---|
[백준 1769번] 3의 배수 - JAVA 알고리즘 (0) | 2022.04.08 |
[백준 2860번] 종이에 숫자 쓰기 - JAVA 알고리즘 (0) | 2022.04.01 |
[백준 1452번] 방 번호 - JAVA 알고리즘 (0) | 2022.04.01 |
[백준 2863번] 5와 6의 차이 - JAVA 알고리즘 (0) | 2022.04.01 |
Comments