hyeon.s
개발로그
hyeon.s
전체 방문자
오늘
어제
  • 분류 전체보기 (150)
    • Web 및 인프라 (1)
      • Web (1)
      • Terraform (2)
      • Docker (1)
    • Android (1)
      • 공부 (28)
      • 트러블슈팅 (12)
      • 프로젝트 개발 (10)
      • Compose (2)
      • 우테코 프리코스 (0)
    • Server (5)
      • 공부 (1)
      • Spring (4)
    • 알고리즘 (68)
      • 문제풀이 (C++,Kotlin) (54)
      • 공부 (13)
    • 디자인 (3)
      • UI (3)
    • Language (5)
      • Kotlin (5)
      • JAVA (0)
    • IT 동아리 (8)
      • UMC 3기 (Android) (7)
      • Sopt 32기 (Android) (1)

Github

글쓰기 / 관리자
hELLO · Designed By 정상우.
hyeon.s
알고리즘/문제풀이 (C++,Kotlin)

[BOJ/C++] 6198번 옥상 정원 꾸미기

[BOJ/C++] 6198번 옥상 정원 꾸미기
알고리즘/문제풀이 (C++,Kotlin)

[BOJ/C++] 6198번 옥상 정원 꾸미기

2023. 1. 2. 19:09
728x90

문제 설명

도시에는 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이다.

입력

  • 첫 번째 줄에 빌딩의 개수 N이 입력된다.(1 ≤ N ≤ 80,000)
  • 두 번째 줄 부터 N+1번째 줄까지 각 빌딩의 높이가 hi 입력된다. (1 ≤ hi ≤ 1,000,000,000)

출력

  • 각 관리인들이 벤치마킹이 가능한 빌딩의 수의 합을 출력한다.

문제풀이

스택 너무너무너무 어렵다. 며칠전에 푼 탑 같은 문제가 많은거같은데 O(N)안에 어떻게 풀어야할지 감이 안온다.

그래서 이번에도 1시간 붙잡고있다가 다른 풀이를 봤는데 monotone stack을 이용해서 푼다고한다.

while문을 돌면서 push하기전에 현재 탑보다 입력 h가 더 크고 stack이 비어있는지 확인을 한다음에 push를 하는 과정을 반복하면서 값을 넣는 방식으로 문제를 푼거같다.

코드

#include <iostream>
#include <stack>
using namespace std;

int N, h;
stack<long long> stk;

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	long long total = 0;
	cin >> N;
	for (int i = 0; i < N; i++)
	{
		cin >> h;
		while (!stk.empty() && stk.top() <= h)
		{
			stk.pop();
		}
		total = (long long)stk.size() + total;
		stk.push(h);
	}
	cout << total << "\n";
}

비슷한 유형을 많이 풀어봐야지 감이올듯..

728x90
저작자표시 (새창열림)

'알고리즘 > 문제풀이 (C++,Kotlin)' 카테고리의 다른 글

[BOJ/C++] 1021번 회전하는 큐  (0) 2023.01.06
[BOJ/C++] 17298번 오큰수  (0) 2023.01.04
[BOJ/C++] 2493번 탑  (0) 2022.12.30
[BOJ/C++] 5397번 키로거  (0) 2022.12.26
[BOJ/C++] 3273번 두 수의 합  (0) 2022.12.26
'알고리즘/문제풀이 (C++,Kotlin)' 카테고리의 다른 글
  • [BOJ/C++] 1021번 회전하는 큐
  • [BOJ/C++] 17298번 오큰수
  • [BOJ/C++] 2493번 탑
  • [BOJ/C++] 5397번 키로거
hyeon.s
hyeon.s
이유있는 코드를 짜자

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.