소소한 개발자
[백준] 17608 - 막대기 본문
문제 링크
17608번: 막대기
아래 그림처럼 높이만 다르고 (같은 높이의 막대기가 있을 수 있음) 모양이 같은 막대기를 일렬로 세운 후, 왼쪽부터 차례로 번호를 붙인다. 각 막대기의 높이는 그림에서 보인 것처럼 순서대로
www.acmicpc.net
코드
#include <iostream>
#include <stack>
int main()
{
int n;
int sticks[100001] = {};
std::stack<int> s({ 0 });
std::cin >> n;
for (int i = 0; i < n; i++)
{
std::cin >> sticks[i];
}
for (int i = n - 1; i >= 0; i--)
{
if (sticks[i] > s.top())
s.push(sticks[i]);
}
std::cout << s.size() - 1;
}
풀이 해설
이 문제에 핵심은 이전에 등장 했던 사람보다 키가 같거나 작은 사람을 볼 수 없다.
즉 다르게 말하면 이전에 나왔던 사람들 보다 키가 커야한다
으로 재정의를 할 수 있다.
문제는 입력에서 주워진 값은
왼쪽에서 오른쪽순서로 값을 주워지고 이 문제에서 요구하는 시야는 오른쪽에서 왼쪽이다.
그러면 왼쪽에서 오른쪽순서로 값을 받은 뒤 역순으로 읽으면 된다.
그러면 이 전재를 기반으로 코드를 작성하면 위와 같은 코드를 작성하게 되었다.
스택을 초기화하는 코드를 보면
std::stack<int> s({ 0 });
으로 되어있다.
현재 문제에서는 모든 사람에 키가 1보다 크다.
그러면 이 스택에서 의미하는 0은 아직 사람을 세지 않은 경우이다.
0 말고도 스택을 비워서
if (s.empty() || sticks[i] > s.top())
이렇게도 가능하다.
'온라인 저지 > 백준' 카테고리의 다른 글
[백준] 14726 - 신용카드 판별 (0) | 2021.08.06 |
---|---|
[백준] 1388 - 바닥 장식 (0) | 2021.08.05 |
[백준] 14730 - 謎紛芥索紀 (Small) (0) | 2021.08.05 |
[백준] 13771 - Presents (0) | 2021.08.01 |
[백준] 2959 - 거북이 (0) | 2021.08.01 |
Comments