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$번째 건물 기준으로 $i - 1$, $i - 2$, ..., $1$번째 건물은 왼쪽에, $i + 1$, $i + 2$, ..., $N$번째 건물은 오른쪽에 있다. 각 건물 사이의 거리는 다 동일하다.
+
+현재 있는 건물의 높이가 $L$이라고 가정하면 높이가 $L$보다 큰 곳의 건물만 볼 수 있다.
+
+바라보는 방향으로 높이가 $L$인 건물 뒤에 높이가 $L$이하인 건물이 있다면 가려져서 보이지 않는다.
+
+
+
+
+ 번호 |
+ 1 |
+ 2 |
+ 3 |
+ 4 |
+ 5 |
+ 6 |
+ 7 |
+ 8 |
+
+
+ 높이 |
+ 3 |
+ 7 |
+ 1 |
+ 6 |
+ 3 |
+ 5 |
+ 1 |
+ 7 |
+
+
+ 보이는 건물 번호 |
+ 2 |
+ x |
+ 2, 4, 8 |
+ 2, 8 |
+ 2,4,6,8 |
+ 2,4,8 |
+ 2,4,6,8 |
+ x |
+
+
+
+
+각 건물에서 볼 수 있는 건물들이 어떤것이 있는지 구해보자.
+
+### 입력
+
+ 첫번째 줄에 건물의 개수 $N$이 주어진다.
+
+두번째 줄에는 $N$개의 건물 높이가 공백으로 구분되어 주어진다.
+
+### 출력
+
+ $i(1 \le i \le N)$번째 건물에서 볼 수 있는 건물의 개수를 출력한다.
+
+만약 볼 수 있는 건물의 개수가 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;
+}