blog 이전
- git blog io 사용할때 쓴 포스팅 이전 - 현재 형식에 맞게 수정
This commit is contained in:
@@ -0,0 +1,118 @@
|
||||
---
|
||||
title: Baekjoon online judge. 6198.옥상 정원 꾸미기
|
||||
date: 2022-03-29
|
||||
tags: algorithmsolutions, 공부, stack
|
||||
excerpt: 6198.옥상 정원 꾸미기 - 백준온라인
|
||||
---
|
||||
# 6198.옥상 정원 꾸미기 - 백준온라인
|
||||
해당 문제는 스택(stack) 자료구조를 활용하여 풀어보았습니다.
|
||||
|
||||
링크 :
|
||||
[](https://www.acmicpc.net/problem/6198)
|
||||
|
||||
---
|
||||
## 1. 문제
|
||||
<details>
|
||||
<summary>문제 보기</summary>
|
||||
<div markdown="1">
|
||||
|
||||
|시간 제한|메모리 제한|
|
||||
|------|---|
|
||||
|1 초|128 MB|
|
||||
|
||||
도시에는 N개의 빌딩이 있다.
|
||||
|
||||
빌딩 관리인들은 매우 성실 하기 때문에, 다른 빌딩의 옥상 정원을 벤치마킹 하고 싶어한다.
|
||||
|
||||
i번째 빌딩의 키가 hi이고, 모든 빌딩은 일렬로 서 있고 오른쪽으로만 볼 수 있다.
|
||||
|
||||
i번째 빌딩 관리인이 볼 수 있는 다른 빌딩의 옥상 정원은 i+1, i+2, .... , N이다.
|
||||
|
||||
그런데 자신이 위치한 빌딩보다 높거나 같은 빌딩이 있으면 그 다음에 있는 모든 빌딩의 옥상은 보지 못한다.
|
||||
|
||||
예) N=6, H = {10, 3, 7, 4, 12, 2}인 경우
|
||||
|
||||
```
|
||||
=
|
||||
= =
|
||||
= - =
|
||||
= = = -> 관리인이 보는 방향
|
||||
= - = = =
|
||||
= = = = = =
|
||||
10 3 7 4 12 2 -> 빌딩의 높이
|
||||
[1][2][3][4][5][6] -> 빌딩의 번호
|
||||
```
|
||||
|
||||
- 1번 관리인은 2, 3, 4번 빌딩의 옥상을 확인할 수 있다.
|
||||
- 2번 관리인은 다른 빌딩의 옥상을 확인할 수 없다.
|
||||
- 3번 관리인은 4번 빌딩의 옥상을 확인할 수 있다.
|
||||
- 4번 관리인은 다른 빌딩의 옥상을 확인할 수 없다.
|
||||
- 5번 관리인은 6번 빌딩의 옥상을 확인할 수 있다.
|
||||
- 6번 관리인은 마지막이므로 다른 빌딩의 옥상을 확인할 수 없다.
|
||||
|
||||
따라서, 관리인들이 옥상정원을 확인할 수 있는 총 수는 3 + 0 + 1 + 0 + 1 + 0 = 5이다.
|
||||
|
||||
|
||||
### 입력(Input)
|
||||
|
||||
- 첫 번째 줄에 빌딩의 개수 N이 입력된다.(1 ≤ N ≤ 80,000)
|
||||
- 두 번째 줄 부터 N+1번째 줄까지 각 빌딩의 높이가 hi 입력된다. (1 ≤ hi ≤ 1,000,000,000)
|
||||
|
||||
### 출력(Output)
|
||||
|
||||
- 각 관리인들이 벤치마킹이 가능한 빌딩의 수의 합을 출력한다.
|
||||
|
||||
</div>
|
||||
</details>
|
||||
|
||||
---
|
||||
|
||||
## 2. 문제 풀이
|
||||
|
||||
처음에는 입력의 상세를 보지 않고 평소처럼 int형을 사용해서 문제를 풀려고 했었다. 그러니 틀렸습니다가 나오고, 틀린 방향을 못 찾아서 고민했었다. 이 문제는 높이의 범위가 있기 때문에 long 타입을 선언해야 정확한 답을 구할 수 있다.
|
||||
|
||||
문제 해결을 위해서는 Stack을 잘 활용 할 수 있어야 해결 할 수 있었다.
|
||||
이중 배열을 설정해서 뒤의 높이가 현 위치 빌딩보다 높거나 같으면 탈출하는 방식으로 문제를 접근했었는데, 그러니 했었다.
|
||||
|
||||
그래서 Stack의 성질을 이용하여 입력의 앞부터 비교하여 추가하며 최종적으로 각 관리인들이 벤치마킹 가능한 빌딩의 수 합을 구할 수 있었다.
|
||||
|
||||
|
||||
```java
|
||||
import java.io.IOException;
|
||||
import java.util.Scanner;
|
||||
import java.util.Stack;
|
||||
|
||||
public class RooftopGarden_6198 {
|
||||
public long solution(long[] b) {
|
||||
long answer = 0;
|
||||
int bLen = b.length;
|
||||
Stack<Long> st = new Stack<>();
|
||||
|
||||
for(int i = 0; i < bLen; i++) {
|
||||
|
||||
while(!st.isEmpty()) {
|
||||
if(st.peek() <= b[i]) st.pop();
|
||||
else break;
|
||||
}
|
||||
|
||||
answer += st.size();
|
||||
st.add(b[i]);
|
||||
}
|
||||
|
||||
return answer;
|
||||
}
|
||||
public static void main(String[] args) throws IOException {
|
||||
RooftopGarden_6198 mc = new RooftopGarden_6198();
|
||||
Scanner sc = new Scanner(System.in);
|
||||
int N = sc.nextInt();
|
||||
|
||||
long[] building = new long[N];
|
||||
for(int i = 0; i < N; i++) {
|
||||
building[i] = sc.nextLong();
|
||||
}
|
||||
|
||||
System.out.println(mc.solution(building));
|
||||
}
|
||||
}
|
||||
|
||||
```
|
||||
Reference in New Issue
Block a user