[백준/BOJ] 17608번_막대기 (C++/Java)

JIMIN·2023년 2월 2일

BOJ_Bronze

목록 보기
54/75

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

문제


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

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


입력


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


출력


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



💻 예제 입력

6
6
9
7
6
4
6

💻 예제 출력

3

풀이


막대기 값들을 배열에 넣은 후 가장 마지막 원소부터 검사하는데, 특정 시점에 가장 높은 막대기 높이인 top(초기값은 0)보다 크면 카운트하고 top 값을 해당 막대기 높이로 갱신함.


C++ 소스코드


#include <iostream>
using namespace std;

int main(void)
{
    int N, cnt = 0, top = 0;
    cin >> N;
    
    int *stick = new int[N];
    for (int i = 0; i < N; i++)
        cin >> stick[i];
    
    // 배열의 맨 뒤(맨 오른쪽 막대기)부터 확인
    for (int j = N-1; j >= 0; j--)
    {
        // 막대기 높이가 top 보다 크면 카운트
        if (stick[j] > top) {
            cnt++;
            top = stick[j]; // 새로운 top은 해당 막대기가 됨
        }
    }
    cout << cnt << "\n";
}

Java 소스코드


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws IOException
    {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        int cnt = 0, top = 0;

        int[] stick = new int[N];
        for (int i = 0; i < N; i++)
            stick[i] = Integer.parseInt(br.readLine());

        // 배열의 맨 뒤(맨 오른쪽 막대기)부터 확인
        for (int j = N-1; j >= 0; j--)
        {
            // 막대기 높이가 top 보다 크면 카운트
            if (stick[j] > top) {
                cnt++;
                top = stick[j]; // 새로운 top은 해당 막대기가 됨
            }
        }
        System.out.println(cnt);
    }
}
profile
잘못된 코드나 정보가 있다면 알려주세요! 👋🏻

0개의 댓글