백준 알고리즘 단계별로 풀어보기/스택

백준 알고리즘 17608번 막대기(C++)

MNMNWVWV 2023. 7. 14. 12:50
728x90
반응형
브론즈Ⅱ

 

https://www.acmicpc.net/problem/17608

 

17608번: 막대기

아래 그림처럼 높이만 다르고 (같은 높이의 막대기가 있을 수 있음) 모양이 같은 막대기를 일렬로 세운 후, 왼쪽부터 차례로 번호를 붙인다. 각 막대기의 높이는 그림에서 보인 것처럼 순서대로

www.acmicpc.net

 

시간 제한 메모리 제한 제출 정답 맞힌 사람 정답 비율
1 초 (추가 시간 없음) 512 MB 20393 8741 7076 43.964%

 

문제

아래 그림처럼 높이만 다르고 (같은 높이의 막대기가 있을 수 있음) 모양이 같은 막대기를 일렬로 세운 후, 왼쪽부터 차례로 번호를 붙인다. 각 막대기의 높이는 그림에서 보인 것처럼 순서대로 6, 9, 7, 6, 4, 6 이다. 일렬로 세워진 막대기를 오른쪽에서 보면 보이는 막대기가 있고 보이지 않는 막대기가 있다. 즉, 지금 보이는 막대기보다 뒤에 있고 높이가 높은 것이 보이게 된다. 예를 들어, 그림과 같은 경우엔 3개(6번, 3번, 2번)의 막대기가 보인다.

 

N개의 막대기에 대한 높이 정보가 주어질 때, 오른쪽에서 보아서 몇 개가 보이는지를 알아내는 프로그램을 작성하려고 한다.

입력

첫 번째 줄에는 막대기의 개수를 나타내는 정수 N (2 ≤ N ≤ 100,000)이 주어지고 이어지는 N줄 각각에는 막대기의 높이를 나타내는 정수 h(1 ≤ h ≤ 100,000)가 주어진다.

출력

오른쪽에서 N개의 막대기를 보았을 때, 보이는 막대기의 개수를 출력한다.

예제 입력 1

6
6
9
7
6
4
6

예제 출력 1

3

예제 입력 2

5
5
4
3
2
1

예제 출력 2

5

 

풀이 방법

입력받은 수를 차례로 스택에 집어넣은 후 스택의 top에 있는 값은 무조건 보이는 막대기이므로 우선 max에 넣는다. 그 후 하나씩 pop하며 max에 있는 값보다 크면 max에 pop한 값을 넣고 cnt를 1 증가시키면 된다.

 

내 코드
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
#include <iostream>
using namespace std;
 
#include <stack>
 
int main() {
    
    stack<int> stack;
 
    int n;
    cin >> n;
 
    for (int i = 0; i < n; i++) {
        int m;
        cin >> m;
        stack.push(m);
    }
    
    int cnt = 1;
    int max = stack.top();
    while (stack.empty() != true) {
        if (stack.top() > max) {
            max = stack.top();
            cnt++;
        }
        stack.pop();
    }
 
    cout << cnt;
 
    return 0;
}
cs
반응형

 

728x90
반응형