: solved. ac - bronze 1
https://www.acmicpc.net/problem/2846
2846번: 오르막길
상근이는 자전거를 타고 등교한다. 자전거 길은 오르막길, 내리막길, 평지로 이루어져 있다. 상근이는 개강 첫 날 자전거를 타고 가면서 일정 거리마다 높이를 측정했다. 상근이는 가장 큰 오르
www.acmicpc.net
예제 입력 1
8
12 20 1 3 4 4 11 1
예제 출력 1
8
예제 입력 2
6
10 8 8 6 4 3
예제 출력 2
0
정답
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {
int road[1000] = { 0 };
int n, max = 0, new = 0, start = 0;
int incline = 0;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &road[i]);
}
for (int i = 0; i < n; i++) {
if (incline == 0) {
if (i <= (n - 2) && road[i] < road[i + 1]) {
start = road[i];
incline = 1;
}
}
else {
if (i == (n - 1) || road[i] >= road[i + 1]) {
new = road[i] - start;
if (new > max) max = new;
incline = 0;
continue;
}
}
}
printf("%d", max);
return 0;
}
해설
길의 높이를 배열에 담는다. 1000개의 수까지 들어오므로 인덱스의 범위도 그에 일치시킨다.
n은 배열에 든 수의 개수, max는 그 시점까지의 최대 오르막 높이,
new는 새로 탐지된 오르막의 높이, start는 그 시점에서 탐지하고 있는 오르막의 시작점이다.
그리고 incline은 현재 조사하는 인덱스가 오르막에 있는지 아닌지를 가른다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {
int road[1000] = { 0 };
int n, max = 0, new = 0, start = 0;
int incline = 0;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &road[i]);
}
for문으로 길의 높이를 처음부터 끝까지 훑어 가며 검사한다.
incline 변수에 따라 조건문을 달리한다. 1은 오르막, 0은 아닌 곳이다.
오르막에 있지 않을 때 -> 현재 위치가 길의 끝이 아니고, 다음 위치가 현재 위치보다 높을 경우 (오르막이 나타났을 경우)
현재 위치를 start에 저장하고 incline을 1로 만들어 오르막 상태임을 표시한다.
위 조건에 해당하지 않으면 조치 없이 다음 위치로 넘어간다.
오르막에 있을 때 -> 현재 위치가 길의 끝이거나, 다음 위치가 현재 위치보다 높지 않을 경우 (오르막이 끝났을 경우)
현재 위치에서 start를 빼 높이를 계산한다. 이 값을 new에 담는다.
그리고 이전까지의 오르막 높이 중 가장 큰 값이 저장되어 있을 max와 새로 얻은 높이 new를 비교하여
new가 더 큰 경우 max에 이 값을 담는다.
오르막이 끝났으므로 incline을 0으로 만들고, 다음 위치로 넘어간다.
'현재 위치가 길의 끝인가'를 조사하는 것은 인덱스 오류를 막기 위함이다.
'다음 위치' (=[i+1]) 가 길에 없다면 인덱스 오류가 일어나게 되므로,
or이나 and문을 써서 이 조건을 검사하는 것을 방지한다.
for (int i = 0; i < n; i++) {
if (incline == 0) { //오르막 도중이 아닐 때
if (i <= (n - 2) && road[i] < road[i + 1]) {
start = road[i];
incline = 1;
//오르막 상태 설정
}
}
else { //오르막 도중일 때
if (i == (n - 1) || road[i] >= road[i + 1]) {
//오르막이 끝나면
new = road[i] - start;
//오르막 높이 계산
if (new > max) max = new;
//기존 최대 오르막보다 클 경우 최대를 이 오르막으로
incline = 0;
//오르막 상태 해제
continue;
}
}
}
printf("%d", max);
return 0;
}
'C언어 > BAEKJOON' 카테고리의 다른 글
[백준] 1546. 평균 (0) | 2022.08.02 |
---|---|
[백준] 2947. 나무 조각 (0) | 2022.08.02 |
[백준] 1357. 뒤집힌 덧셈 (0) | 2022.07.28 |
[백준] 1292. 쉽게 푸는 문제 (0) | 2022.07.21 |
[백준] 1145. 적어도 대부분의 배수 (0) | 2022.07.21 |