본문 바로가기
알고리즘/문제

[백준] 17608. 막대기 <C++>

by 코드 이야기 2020. 4. 16.
728x90

Olympiad > 한국정보올림피아드 > KOI 2019 1차대회 > 초등부 1번

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

 

17608번: 막대기

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

www.acmicpc.net

어렵지 않았던 문제다. 

약간 입체적으로 생각해볼 문제?

 

 

막대기를 오른쪽에서 볼 때 각각의 막대기 앞에 자신보다 큰 것이 있다면 보이지 않는다.

 

오른쪽에서 시작하여 왼쪽으로 가며 큰 값을 기억하고, 만약 기억해둔 큰 값보다 자신이 크다면 막대기는 보인다.

 

큰 값을 기억하며 개수도 세주는 방법이다.

 

 

 

<배열만 이용>

#include <iostream>
using namespace std;

int main() {
  int arr[100001], n, max=0, count=0;

  cin>>n;

  for(int i=0; i<n; i++)
      cin>>arr[i];

  for(int i=n-1; i>=0; i--)  //n-1번 방까지 입력된 배열을 거꾸로 읽어간다.
  {
    if(max < arr[i])  //뒤부터, 앞으로 읽어가면서 max변수에 가장 긴 막대기의 길이를 저장하고, 개수를 세준다.
    {
      count++;
      max=arr[i];
    }
  }

  cout<<count;

}

 

 

<스택 이용>

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

int main() {
  int max=0, n, m, cnt=0;
  stack<int> s;

  cin>>n;
  for(int i=0; i<n; i++)
  {
    cin>>m; 
    s.push(m);
  }
  while(s.size())
  {
    if(max<s.top())
    {
      max=s.top();
      cnt++;
    }
    s.pop();
  }  
  cout<<cnt;
}

 

728x90

'알고리즘 > 문제' 카테고리의 다른 글

[백준] 18512. 점프 점프 <C++>  (0) 2020.04.24
[백준] 4344. 평균은 넘겠지 <C++>  (0) 2020.04.17
[백준] 10798. 세로읽기 <C++>  (1) 2020.04.16
[백준] 1157. 단어 공부 <C++>  (0) 2020.04.15
[백준] 14563. 완전수 <C++>  (0) 2020.04.14

댓글