17608번: 막대기

Minseo Kang·2023년 4월 18일
0

백준

목록 보기
12/13
post-thumbnail

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

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


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


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




[ 핵심 ]
1. 스택 사용
2. 입력받은 순서대로 일단 다 push
3. 맨 위의 top 꺼내서 저장
4. 스택의 요소를 하나씩 꺼내면서 top보다 큰지 검사
5. top보다 크다면 해당 값을 top으로 지정 (이 부분을 안해서 계속 오류 남!!) 하고 count 값 증가




[ 풀이 ]

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
import java.util.StringTokenizer;

public class Main {

    public static void main(String[] args) throws IOException {

        // 입력받기 위함
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;

        // 보이는 막대의 개수
        int countVisible = 0;

        // 막대의 개수 입력받기
        int N = Integer.parseInt(br.readLine());

        // 스택 생성
        Stack stack = new Stack();

        // 막대의 개수만큼 막대의 길이 입력받고, push
        for(int i = 0; i < N; i++) {
            st = new StringTokenizer(br.readLine());
            stack.push(Integer.parseInt(st.nextToken()));
        }

        // 맨 위의 요소 저장
        int top = (int) stack.pop();

        // 맨 위의 요소는 항상 보이니까 count 증가
        countVisible++;


        // 맨 위의 요소를 pop 했으므로 남은 막대의 개수만큼 반복
        for(int i = 0; i < N-1; i++) {
            int value = (int) stack.pop(); // pop 한 값 저장

            // top 값 보다 크면
            if(value > top)  {
                top = value; // top 을 value 로 설정
                countVisible++; // count 증가
            }
        }

        System.out.println(countVisible);
    }
}

0개의 댓글