문제
문제
민식이는 “오민식”이라는 팀이름으로 수없이 많은 로봇대회를 우승했다. 따라서 민식이의 집에는 트로피가 많다. 민식이는 트로피를 어떤 선반 위에 올려놨다. 이 선반은 민식이의 방문을 열고 들어가자마자 선반의 왼쪽이 보인다. 다른말로 하자면, 뒤의 트로피가 앞의 트로피에 가려져 있다는 말이다.
안타깝게도, 높이가 큰 트로피가 높이가 작은 트로피의 왼쪽에 있다면, 높이가 작은 트로피는 큰 트로피에 가려서 보이지 않게 된다. 트로피는 자기의 앞에 (보는 사람의 관점에서) 자기보다 높이가 작은 트로피가 있을 때만 보이게 된다. 민식이는 선반을 180도 회전시켜서 트로피가 보이는 개수를 변하게 할 수도 있다.
선반위에 올려져 있는 트로피의 높이가 주어졌을 때, 왼쪽에서 봤을 때 보이는 개수와, 오른쪽에서 봤을 때 보이는 개수를 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 트로피의 개수 N (1 ≤ N ≤ 50)이 주어진다. 둘째 줄부터 N개의 줄에 왼쪽의 트로피부터 차례대로 높이가 주어진다. 트로피의 높이는 100보다 작거나 같은 자연수이다.
출력
첫째 줄에 왼쪽에서 봤을 때 보이는 개수, 둘째 줄에 오른쪽에서 봤을 때 보이는 개수를 출력한다.
예제 입력 1 복사
5
1
2
3
4
5
예제 출력 1 복사
5
1
예제 입력 2 복사
4
5
5
5
5
예제 출력 2 복사
1
1
예제 입력 3 복사
5
1
2
5
2
1
예제 출력 3 복사
3
3
예제 입력 4 복사
7
1
4
2
5
3
7
1
예제 출력 4 복사
4
2
출처
- 문제의 오타를 찾은 사람: adh0463, hyunynim
- 문제를 번역한 사람: baekjoon
- 빠진 조건을 찾은 사람: juchan1220
알고리즘 분류
#include<stdio.h>
int main(void) {
int n, h, i, fronttrophy = 0, backtrophy = 0, arr[50];
scanf("%d", &n);
for(i=0;i<n;i++){
scanf("%d", &arr[i]);
}
//정면 시야의 트로피 수
h = 0;
for(i=0;i<n;i++){
if(arr[i] > h){
fronttrophy++;
h = arr[i];
}
}
//후면 트로피 수
h = 0;
for(i=n-1;i>=0;i--){
if(arr[i] > h){
backtrophy++;
h = arr[i];
}
}
printf("%d\n%d", fronttrophy, backtrophy);
}
첫번째 n은 진열되어 있는 트로피의 숫자를 입력받으며 이후 n개의 트로피의 각가의 높이를 입력받는다.
트로피는 1열로 세워져 있으며 높이에 따라 정면과 후면에서 몇개의 트로피가 보이는지 계산한다.
트로피의 높이는 배열로 입력 받았으며 최고 높이값을 h = 0으로 설정한 뒤 들어온 입력이 h 보다 크다면 트로피가 보이는 것이므로 fronttrophy++를 실행하고 이후 h 값을 arr[i]로 수정해 현재의 최대치보다 작다면 보이지 않으므로 반복문을 돌린다. backtrophy도 동일한 방법으로 계산된다.
Git Hub
BaekJoon-Study/1668 : 트로피 진열 at C · GUuu9/BaekJoon-Study (github.com)
'백준 코드 공부 > C언어' 카테고리의 다른 글
백준 1032 : 명령 프롬프트 (C언어) (0) | 2022.01.02 |
---|---|
백준 5532 : 방학숙제 (C언어) (0) | 2022.01.02 |
백준 5596 : 시험점수 (C언어) (0) | 2021.12.13 |
백준 1267 : 핸드폰 요금 (C언어) (0) | 2021.12.11 |
백준 1673 : 치킨 쿠폰 (C언어) (0) | 2021.12.05 |