[백준 2493번] 탑

2021. 10. 15. 01:08·알고리즘 문제풀이/백준
반응형

문제 링크: https://www.acmicpc.net/problem/2493

 

2493번: 탑

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

www.acmicpc.net

문제 풀이

첫 번째 탑에서 시작해서 탑을 두 개씩(i, i+1) 이용하면 스택으로 문제를 해결할 수 있습니다. 

 

 

스택을 하나 준비해서 탑의 번호를 저장합니다

이때 스택의 top()은 i번쨰 탑이 레이저를 발사했을 때 수신받을 수 있는 가장 가까운 탑입니다.

 

수신받을 수 있는 탑이 없는 경우는 높이가 0인 0번째 탑이 존재한다고 생각하고 0번째 탑이 수신하도록 하면 됩니다.

 

이제 i번째와 i+1번째 탑 두 개를 이용해서 다음과 같은 알고리즘을 만들 수 있습니다.

1. 만약 i+1번째 탑이 i번째 탑보다 크다면

-> 스택의 top()이 i+1번쨰 탑보다 클 때까지 스택을 pop()합니다

  ->스택의 top()이 i+1 번째 탑보다 작으면 top()이 i+1번째 탑의 레이저를 수신하지 못합니다.

  (단 스택의 top() > 0 이상일 때입니다. 왜냐하면 아무것도 수신받는 레이저가 없을 땐 0번째 탑이 수신하도록 했습니다.

2. 그렇지 않으면 만약 i+1번째 탑이 i번째 탑보다 작으면

-> i번째 탑을 스택에 push()합니다.

  -> i번쨰 탑이 i+1번째의 탑의 레이저를 수신하게 만듭니다.

 

3. 그렇지 않으면 만약 i+1번째 탑이 i번쨰 탑보다 작으면

-> 스택을 pop()하고 i번쨰 탑을 스택에 push()합니다.

  -> i+1번째 레이저를 가장 가까운 탑이 수신하도록 합니다.

 

문제의 입력을 예로 설명하면

i = 1일 때

0번째 탑이 1번째 탑의 레이저를 수신합니다.

 

i = 2일 때

1번째 탑이 2번째 탑의 레이저를 수신하고 2번째 탑을 스택에 push()합니다.

 

i = 3일 때

2번째 탑이 3번째 탑의 레이저를 수신합니다.

 

i = 4일 때

2번째 탑이 4번째 탑의 레이저를 수신하고 4번째 탑을 스택에 push()합니다.

 

i = n일 때

4번째 탑이 5번째 탑의 레이저를 수신합니다.

 

 

 

<C++ 소스 코드> 스택, 자료구조

 

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
33
34
35
36
37
38
39
40
41
42
43
44
#include <iostream>
#include <vector>
#include <stack>
using namespace std;
 
int height[500001];
int res[500001];
 
int main(void) {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
 
    int n; cin >> n;
    stack<int> big;
    for (int i = 1; i <= n; i++) {
        cin >> height[i];
    }
 
    big.push(0);
 
    for (int i = 1; i < n; i++) {
        res[i] = big.top(); //스택에 top()은 i번째 레이저를 수신
        if (height[i + 1] > height[i] && big.top()) {
            while (height[big.top()] < height[i + 1] && big.top()) {//스택의 top()이 i+1번째 탑보다 커야 하므로 작은 top()은 제거
                big.pop();
            }
        }
        else if (height[i + 1] < height[i]) {
            big.push(i);//i번째 탑을 i+1번째 탑이 만나는 가장 가까우면서 큰 탑으로 만듬
        }
        else if (height[i + 1] == height[i]) { // 연속된 크기의 탑일 경우엔 가장 가까운 탑이 수신하도록 함
            big.pop();
            big.push(i);
        }
    }
    res[n] = big.top();
    for (int i = 1; i <= n; i++) {
        cout << res[i] << " ";
    }
 
 
    return 0;
}
 
Colored by Color Scripter
cs
반응형
저작자표시 (새창열림)

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

[백준 2164번] 카드2  (0) 2021.10.27
[백준 6198번] 옥상 정원 꾸미기  (0) 2021.10.21
[백준 3273번] 두 수의 합  (0) 2021.10.06
[백준 10871번] X보다 작은 수  (0) 2021.10.02
[백준 1197번] 최소 스패닝 트리  (0) 2020.07.26
'알고리즘 문제풀이/백준' 카테고리의 다른 글
  • [백준 2164번] 카드2
  • [백준 6198번] 옥상 정원 꾸미기
  • [백준 3273번] 두 수의 합
  • [백준 10871번] X보다 작은 수
슥지니
슥지니
개발 블로그
  • 슥지니
    슥지니의 코딩노트
    슥지니
  • 전체
    오늘
    어제
    • 분류 전체보기 (199)
      • 알고리즘 문제풀이 (158)
        • 백준 (158)
      • 알고리즘 (6)
      • Node.js (2)
        • MongoDB (1)
        • 기타 (1)
      • spring (0)
      • 가상화폐 (1)
        • 바이낸스(Binance) (1)
      • C++ 테트리스 게임 (1)
      • C++ (10)
      • 안드로이드 프로그래밍 (21)
        • 코틀린 (21)
  • 블로그 메뉴

    • 홈
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    그래프
    Kotlin
    dp
    코틀린을 활용한 안드로이드 프로그래밍
    우선순위 큐
    백트랙킹
    그리디
    백준
    알고리즘
    dfs
    콘솔
    콘솔 테트리스 게임
    다이나믹 프로그래밍
    C++
    C
    BFS
    구현
    코틀린
    시뮬레이션
    자료구조
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
슥지니
[백준 2493번] 탑
상단으로

티스토리툴바