새벽코딩

[백준] [17608] 막대기 (구현) (JAVA) 본문

알고리즘

[백준] [17608] 막대기 (구현) (JAVA)

J 코딩 2023. 1. 3. 23:28
반응형

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

 

17608번: 막대기

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

www.acmicpc.net


문제

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

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

입력

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

출력

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

예제 입력 1 복사

6
6
9
7
6
4
6

예제 출력 1 복사

3

예제 입력 2 복사

5
5
4
3
2
1

예제 출력 2 복사

5

※ JAVA 코드 (막대기)

import java.io.*;

public class Main {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int cnt = 1;
		// 막대기의 개수 (2 <= N <= 100,000)
		int N = Integer.parseInt(br.readLine());
		
		int[] h = new int[N];
		// 각 막대기의 높이
		for(int i = 0; i < N; i++) {
			h[i] = Integer.parseInt(br.readLine());
		}
		
		// 가장오른쪽 막대기의 길이
		int maxStick = h[N-1];
		for(int i = N-2; i >= 0; i--) {
			if(h[i] > maxStick) {
				cnt++;
				maxStick = h[i];
			}
		}
		System.out.println(cnt);
	}
}

※ 생각정리 (막대기)

간만에 구현문제를 풀어보았다. 구현은 다양한 풀이방법이 나올 수 있어서 재미있는 문제들이 많다.

막대기의 길이가 주어지고 오른쪽에서 보았을 때 보여지는 막대기 개수를 구하는 문제이며, 이는 오른쪽에 있는 막대기가 왼쪽보다 더 크다면 왼쪽 막대기는 보여지지 않게 된다는 것을 뜻한다.

즉 배열에 각 막대기의 길이를 담고 오른쪽 막대부터 읽어들여 가장 긴 막대기의 길이를 갱신해가며 개수를 구한다.

-새벽코딩-

반응형
Comments