: 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

+ Recent posts