알고리즘 문제/[백준]

[백준] 2493 탑

latter2005 2021. 3. 15. 17:17
 

2493번: 탑

첫째 줄에 탑의 수를 나타내는 정수 N이 주어진다. N은 1 이상 500,000 이하이다. 둘째 줄에는 N개의 탑들의 높이가 직선상에 놓인 순서대로 하나의 빈칸을 사이에 두고 주어진다. 탑들의 높이는 1

www.acmicpc.net

fast io 미적용

문제 확인

 

배열 인덱스를 따라가면서 만족하는 인덱스를 찾는 방식으로 풀 수 있습니다.

스택을 활용하여 문제를 풀어도 비슷한 결과가 나옵니다.

 

풀이

 

2가지 경우로 나눕니다.

  1. 전에 입력받은 탑의 크기가 현재 탑 보다 큰 경우 : 현재 탑이 발사한 레이저 신호를 수신한 탑은 i - 1이 됩니다.
  2. 현재 탑이 작은 경우 : i - 1부터 수신 가능한 탑을 찾아 내려갑니다.

i - 1 번째 탑이 발사한 레이저 신호를 어느 탑이 수신하였는가(dist[i-1])를 보고 수신한 탑이 현재 탑보다 큰 경우 해당 탑을 고르면 됩니다. 만약 해당 탑(dist[i-1]) 또한 현재 탑 보다 작은 경우 이러한 과정을 큰 탑이 나오거나 0에 도달할 때까지 반복합니다.

 

코드

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
32
#include <iostream>
 
using namespace std;
int main() {
    ios_base::sync_with_stdio(0); cin.tie(0);
    int n;
    int ary[500001], dist[500001];
 
    ary[0= 0x7fffffff;
 
    cin >> n;
    for (int i = 1; i <= n; i++)
        cin >> ary[i];
 
 
    for (int i = 2; i <= n; i++) {
        if (ary[i - 1< ary[i]) {
            int t = i - 1;
            while (ary[t] < ary[i])
                t = dist[t];
            dist[i] = t;
        }
        else {
            dist[i] = i - 1;
        }
    }
 
    for (int i = 1; i <= n; i++)
        cout << dist[i] << ' ';
}
 
 
cs
반응형

'알고리즘 문제 > [백준]' 카테고리의 다른 글

[백준] 9370 미확인 도착지  (0) 2021.03.16
[백준] 9660 돌 게임 6  (0) 2021.03.15
[백준] 2836 수상 택시  (0) 2021.03.09
[백준] 1253 좋다  (0) 2021.03.09
[백준] 14442 벽 부수고 이동하기 2  (0) 2021.03.05