백준의 막대기(17608) 문제이다.

[ 문제 바로가기 ]

 

[ 문제풀이 ]

주어진 막대기들을 오른쪽에서 보았을 때, 몇 개의 막대기가 보이는지 구해야 하는 문제이다.

 

먼저, 막대기들을 오른쪽에서 보면 어떤 현상이 일어나는지에 대해서 이야기를 해보자.

예를 들어서 높이가 [ 1 , 2 , 3 , 4 , 5 ] 인 막대기들을 오른쪽에서 본다고 가정해보자.

그럼, 가장 먼저 높이가 '5'인 막대기가 보이게 될 것이다. 그 다음 막대기들은 ?? 당연히 보이지 않게 될 것이다.

왜냐하면 높이가 '5'인 막대기에 가려져 버렸기 때문이다. 가려져서 보이지 않는다는 것은, 현재 보고있는 막대기보다 높이가 더 낮기 때문에 보이지 않는다는 것을 의미한다.

그럼, [ 5 , 5 , 5 , 5 , 5 ] 를 생각해보자. 이 또한, 가장 처음에 높이가 '5'인 막대기만 보이게 될 것이고 나머지 막대기들은 가려져서 보이지 않게 될 것이다.

그렇다면, [ 5 , 4 , 3 , 2 , 1 ] 을 한번 살펴보자. 이 경우에는 5개의 막대가 보이게 될 것이다.

가장 처음에는 높이가 '1'인 막대가, 그 이후에는 높이가 '2'인 막대기이기 때문에 즉, '1'보다 더 큰 막대기 이기 때문에 보이게 될 것이다. 그 이후의 과정은 진행해보지 않겠다.

 

결과적으로 이야기해보자면, "현재 보이는 막대 중, 가장 높이가 높은 막대기 보다 더 높은 막대기가 나오면 그 막대기는 보이게 된다" 라는 것을 알 수 있다.

[ 3 , 4 , 5 , 2 , 1 ] 에서 보면, 가장 처음에는 '1'이 보이게 될 것이고, 그 다음으로 보이는 막대기는 '2'가 될 것인데, '1'과 '2'를 비교했을 때 더 높은 막대기는 '2'가 될 것이다. 그 이후에 막대기는 '5'가 될 것인데, '2'와 '5'를 비교했을 때 더 높은 막대기는 '5'가 될 것이다.

즉 ! 여기까지 봤을 때, 높이가 가장 높은 막대기는 '5'가 된다. 그 이후에 '3'과 '4'는 현재 보고 있는 막대기들 중, 높이가 가장 높은 막대기인 '5'보다 더 작기 때문에 보이지 않는 것이다.

 

[ 소스코드 ]

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
33
34
35
36
37
38
39
40
#include <iostream>
 
#define MAX 100010
using namespace std;
 
int N;
int Arr[MAX];
 
void Input()
{
    cin >> N;
    for(int i = 0 ; i < N; i++cin >> Arr[i];
}
 
void Solution()
{
    int Answer = 0;
    int Max_Height = Arr[N - 1];
    Answer++;
    for(int i = N - 2; i >= 0; i--)
    {
        if(Arr[i] > Max_Height)
        {
            Max_Height = Arr[i];
            Answer++;
        }
    }
    cout << Answer << endl;
}
 
void Solve()
{
    Input();
    Solution();
}
 
int main(void)
{
    Solve();
}
cs

 

 

'[ BOJ Code ] > # BOJ -' 카테고리의 다른 글

[ 백준 15953 ] 상금헌터 (C++)  (1) 2021.09.08
[ 백준 17609 ] 회문 (C++)  (0) 2021.09.07
[ 백준 17612 ] 쇼핑몰 (C++)  (3) 2021.08.25
[ 백준 14916 ] 거스름돈 (C++)  (2) 2021.06.02
[ 백준 1543 ] 문서 검색 (C++)  (0) 2021.06.01

+ Recent posts