본문 바로가기
공부 정리/백준

[백준] 자바 17608 막대기

by 경적필패. 2021. 6. 25.
반응형

문제

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

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

입력

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

출력

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


테스트 케이스

 

초록색 입력 / 검은색 출력

 


접근

막대기를 입력 받는 순서대로 세운 후, 오른쪽에서 보이는 막대기의 수를 구하는 문제입니다.

List를 사용하여 값을 순서대로 받아 온 후, 마지막 막대기보다 큰 값들을 카운트하는 식으로 구현하였습니다.

조심해야 될 것은 마지막 막대기 보다 큰 막대기가 나왔을 때 그것 보다 작은 막대기는 보이지 않는다는 것만 주의하면 될 듯합니다.


코드

import java.awt.desktop.SystemEventListener;
import java.io.*;
import java.math.*;
import java.util.*;

public class Main {

	/*
 	17608 problem 막대기
	*/
	public static void main(String[] args) throws NumberFormatException, IOException {
		// TODO Auto-generated method stub
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		ArrayList<Integer> list = new ArrayList<>();
		
		int input = Integer.parseInt(br.readLine());
		int repeatInput = 0;
		int compNum = 0;
		int count = 0;
		//입력값 받는 반복문
		for(int i=0;i<input;i++) {
			repeatInput = Integer.parseInt(br.readLine());
			list.add(repeatInput);
		}
		//제일 마지막 막대기의 길이값 저장
		compNum = list.get(input-1);
		
		//제일 마지막 막대기 길이보다 긴것들 카운트함
		for(int i=input-2; i>=0; i--) {
		if(list.get(i) > compNum) {
			compNum = list.get(i);
			count++;
		}
		}
		//마지막 막대기도 포함이라 +1해서 출력함
		bw.write(String.valueOf(count+1));
		bw.flush();
		bw.close();
	}
}

주의

오른쪽에서 보는 것이므로, 큰 막대기를 만날수록 기준 값을 높여주어서 보이는 막대기를 계산해야 합니다.

 

반응형

댓글