From 5406af0e999d64c0fb4dd53bd3ce9580071f31b4 Mon Sep 17 00:00:00 2001 From: belowyoon <92996412+belowyoon@users.noreply.github.com> Date: Fri, 26 Apr 2024 02:07:51 +0900 Subject: [PATCH] =?UTF-8?q?[Gold=20III]=20Title:=20=ED=83=91=20=EB=B3=B4?= =?UTF-8?q?=EA=B8=B0,=20Time:=2032=20ms,=20Memory:=204120=20KB=20-Baekjoon?= =?UTF-8?q?Hub?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../README.md" | 78 +++++++++++++++++++ ...21\342\200\205\353\263\264\352\270\260.cc" | 72 +++++++++++++++++ 2 files changed, 150 insertions(+) create mode 100644 "\353\260\261\354\244\200/Gold/22866.\342\200\205\355\203\221\342\200\205\353\263\264\352\270\260/README.md" create mode 100644 "\353\260\261\354\244\200/Gold/22866.\342\200\205\355\203\221\342\200\205\353\263\264\352\270\260/\355\203\221\342\200\205\353\263\264\352\270\260.cc" diff --git "a/\353\260\261\354\244\200/Gold/22866.\342\200\205\355\203\221\342\200\205\353\263\264\352\270\260/README.md" "b/\353\260\261\354\244\200/Gold/22866.\342\200\205\355\203\221\342\200\205\353\263\264\352\270\260/README.md" new file mode 100644 index 0000000..6b662f0 --- /dev/null +++ "b/\353\260\261\354\244\200/Gold/22866.\342\200\205\355\203\221\342\200\205\353\263\264\352\270\260/README.md" @@ -0,0 +1,78 @@ +# [Gold III] 탑 보기 - 22866 + +[문제 링크](https://www.acmicpc.net/problem/22866) + +### 성능 요약 + +메모리: 4120 KB, 시간: 32 ms + +### 분류 + +자료 구조, 스택 + +### 제출 일자 + +2024년 4월 26일 02:07:37 + +### 문제 설명 + +

일직선으로 다양한 높이의 건물이 총 N개가 존재한다. 각 건물 옥상에서 양 옆에 존재하는 건물의 옆을 몇 개 볼 수 있는지 궁금해졌다.

+ +

i번째 건물 기준으로 i1, i2, ..., 1번째 건물은 왼쪽에, i+1, i+2, ..., N번째 건물은 오른쪽에 있다. 각 건물 사이의 거리는 다 동일하다.

+ +

현재 있는 건물의 높이가 L이라고 가정하면 높이가 L보다 큰 곳의 건물만 볼 수 있다.

+ +

바라보는 방향으로 높이가 L인 건물 뒤에 높이가 L이하인 건물이 있다면 가려져서 보이지 않는다.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
번호12345678
높이37163517
보이는 건물 번호2x2, 4, 82, 82,4,6,82,4,82,4,6,8x
+ +

각 건물에서 볼 수 있는 건물들이 어떤것이 있는지 구해보자.

+ +### 입력 + +

첫번째 줄에 건물의 개수 N이 주어진다.

+ +

두번째 줄에는 N개의 건물 높이가 공백으로 구분되어 주어진다.

+ +### 출력 + +

i(1iN)번째 건물에서 볼 수 있는 건물의 개수를 출력한다.

+ +

만약 볼 수 있는 건물의 개수가 1개 이상이라면 i번째 건물에서 거리가 가장 가까운 건물의 번호 중 작은 번호로 출력한다.

+ diff --git "a/\353\260\261\354\244\200/Gold/22866.\342\200\205\355\203\221\342\200\205\353\263\264\352\270\260/\355\203\221\342\200\205\353\263\264\352\270\260.cc" "b/\353\260\261\354\244\200/Gold/22866.\342\200\205\355\203\221\342\200\205\353\263\264\352\270\260/\355\203\221\342\200\205\353\263\264\352\270\260.cc" new file mode 100644 index 0000000..2b0bc1e --- /dev/null +++ "b/\353\260\261\354\244\200/Gold/22866.\342\200\205\355\203\221\342\200\205\353\263\264\352\270\260/\355\203\221\342\200\205\353\263\264\352\270\260.cc" @@ -0,0 +1,72 @@ +#include +#include +#include +#include + +using namespace std; + +int main() { + ios_base::sync_with_stdio(0); + cin.tie(0); + + int n; + cin >> n; + + vector arr(n+1, 0); + vector size(n+1, 0); + vector> dist(n+1, {-1, -1}); + for(int i = 1; i <= n; i++) { + cin >> arr[i]; + } + stack l; + stack r; + + for (int i = n-1; i >= 1; i--) { + if (arr[i+1] > arr[i]) { + while (!r.empty() && arr[r.top()] <= arr[i+1]) { + r.pop(); + } + r.push(i+1); + } else { + while (!r.empty() && arr[r.top()] <= arr[i]) { + r.pop(); + } + } + size[i] += r.size(); + if (!r.empty()) dist[i].second = r.top(); + } + for (int i = 2; i <= n; i++) { + if (arr[i-1] < arr[i]) { + while (!l.empty() && arr[l.top()] <= arr[i]) { + l.pop(); + } + } else if (arr[i-1] > arr[i]) { + while (!l.empty() && arr[l.top()] <= arr[i-1]) { + l.pop(); + } + l.push(i-1); + } + size[i] += l.size(); + if (!l.empty()) dist[i].first = l.top(); + } + + for (int i = 1; i <= n; i++) { + cout << size[i] << " "; + if (size[i] > 0) { + if (dist[i].first == -1) { + cout << dist[i].second; + } else if (dist[i].second == -1) { + cout << dist[i].first; + } else { + if ((i - dist[i].first) <= (dist[i].second - i)) { + cout << dist[i].first; + } else { + cout << dist[i].second; + } + } + } + cout << '\n'; + } + + return 0; +}