아무거나 내꺼 공부할래
온도의 최대값 (1차원 배열 구간합) / c / 제한시간 : 1초 본문
▣ 문제
- 매일 아침 9시에 학교에서 측정한 온도가 어떤 정수의 수열로 주어졌을 때, 연속적인 며칠 동안의 온도의 합이 가장 큰 값을 알아보고자 한다. 예를 들어, 다음과 같이 10일 간의 온도가 주어졌을 때, 3 -2 -4 -9 0 3 7 13 8 -3 모든 연속적인 이틀간의 온도의 합은 다음과 같다.
이때, 온도의 합이 가장 큰 값은 21이다. 매일 측정한 온도가 정수의 수열로 주어졌을 때, 연속적인 며칠 동안의 온도의 합이 가장 큰 값을 계산하는 프로그램을 작성하시오.
▣ 입력설명
- 첫째 줄에는 두 개의 정수 N과 K가 한 개의 공백을 사이에 두고 순서대로 주어진다. 첫 번째 정수 N은 온도를 측정한 전체 날짜의 수이다. N은 2 이상 100,000 이하이다. 두 번째 정수 K 는 합을 구하기 위한 연속적인 날짜의 수이다. K는 1과 N 사이의 정수이다. 둘째 줄에는 매일 측정한 온도를 나타내는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 수들은 모두 -100 이상 100 이하이다.
▣ 출력설명
- 첫째 줄에는 온도의 수열에서 연속적인 K일의 온도의 합이 최대가 되는 값을 출력한다.
▣ 입력 예시
10 2 3 -2 -4 -9 0 3 7 13 8 -3 |
▣ 출력 예시
21 |
<내 코드>
#pragma warning(disable:4996)
#include<stdio.h>
int main() {
int n, k;
int degree[100001];
int max = -2147000000;
int sum = 0;
scanf("%d %d", &n, &k);
for (int i = 1; i <= n; i++) {
scanf("%d", °ree[i]);
}
for (int i = 1; i <= n - k + 1; i++) {
for (int j = i; j < i + k; j++) {
sum += degree[j];
}
if (sum > max) max = sum;
sum = 0;
}
printf("%d\n", max);
return 0;
}
<수정한 코드>
#pragma warning(disable:4996)
#include<stdio.h>
int main() {
int n, k;
int degree[100001];
int max = -2147000000;
int sum = 0;
scanf("%d %d", &n, &k);
for (int i = 1; i <= n; i++) {
scanf("%d", °ree[i]);
}
for (int i = 1; i <= k; i++) {
sum += degree[i];
}
max = sum;
for (int i = k + 1; i <= n; i++) {
sum = sum + degree[i] - degree[i - k];
if (sum > max) max = sum;
}
printf("%d\n", max);
return 0;
}
먼저 처음부터 k번째까지 온도의 합을 max로 저장한 후
k번째부터 하나씩 이동하면서 처음 값을 빼고 마지막 값을 더하면 1차원 배열의 구간합을 나타낸다.
sum = sum + degree[i] - degree[i - k];
입력 예시로 예를 들면,
3 | -2 | -4 | -9 | 0 | 3 | 7 | 13 | 8 | -3 |
SUM = 1 | |||||||||
SUM =1 +(-4)+3 = -6 | |||||||||
SUM=-6+(-9)-(-2)=-13 | |||||||||
SUM=-13+0-(-4)=-9 | |||||||||
SUM=-9+(3)-(-9)=3 |
이런 방법으로 max값과 비교하면서 최대값을 출력한다.
.
저런식으로 처음에 표를 그리면서 규칙을 찾으면 좀 더 효율적인 방법으로 코드를 만들수있겠구먼
'[c언어&c++] 알고리즘 공부 > 인프런(Inflearn)' 카테고리의 다른 글
N!에서 0의 개수 / c / 제한시간 없음 (0) | 2021.01.20 |
---|---|
Jolly Jumpers / c / 제한시간 없음 (0) | 2021.01.18 |
분노유발자 / c / 제한시간 없음 (0) | 2021.01.17 |
Anagram(구글 인터뷰 문제) / c / 제한시간 없음 (0) | 2021.01.16 |
소수의 개수 / c / 제한시간:1초 (0) | 2021.01.16 |