[C]백준_17608 : 막대기

Alal11·2022년 8월 11일
0
post-thumbnail

출처

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개의 막대기를 보았을 때, 보이는 막대기의 개수를 출력한다.


예제 입출력


➡️문제 분석

오른쪽부터 시작해서 오른쪽 막대기 보다 왼쪽 막대기가 클 경우, 개수를 하나씩 증가해주는 방식으로 접근한다.


➡️코드(⭕)

#include <stdio.h>

int main()
{
	int N, arr[100001];
	int max = 0, cnt = 0;					// 길이를 비교하기 위한 기준점 

	scanf("%d", &N);						// 막대의 개수 N 입력

	for (int i = 0; i < N; i++) {
		scanf("%d", &arr[i]);				// N개의 막대 높이 입력
	}

	for (int j = N - 1; j >= 0; j--) {		// 
		if (max < arr[j]) {					// 
			max = arr[j];
			cnt++;
		}
	}
	printf("%d", cnt);						// 오른쪽에서 보이는 막대 개수 출력
    
	return 0;
}

➡️코드 분석

  1. 막대의 개수 N, 막대 개수만큼의 높이를 담을 배열 arr, 막대 길이를 비교하기 위한 기준이 되는 변수 max, 오른쪽에서 보이는 막대 개수를 세는 변수 cnt를 각각 정의해준다.

  2. 막대 개수 N을 입력받고, for문으로 N개의 막대 높이를 차례대로 배열에 입력 받는다.

  3. 오른쪽에서 보는 것이 기준이므로 배열의 끝에서 부터 확인하기 위해 for문을 거꾸로 설정해준다.

  4. if문에서 만약 max 보다 j번째의 막대 길이가 더 길다면, max에 더 긴 j번째 길이를 대입해주고 cnt를 +1 해준다.

  5. 마지막으로 cnt 값을 출력해주면 오른쪽에서 보이는 막대 개수를 구할 수 있다.


➡️end

되게 어려웠는데 원리를 알고 나니 생각보다 쉬운 문제였다.

0개의 댓글