Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

아무거나 내꺼 공부할래

온도의 최대값 (1차원 배열 구간합) / c / 제한시간 : 1초 본문

[c언어&c++] 알고리즘 공부/인프런(Inflearn)

온도의 최대값 (1차원 배열 구간합) / c / 제한시간 : 1초

mero95 2021. 1. 17. 17:05

▣ 문제

- 매일 아침 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", &degree[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;
}

 

데이터가 10000이 넘어가면 제한시간이 초과됨

 

<수정한 코드>

#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", &degree[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값과 비교하면서 최대값을 출력한다.

 

.

 

저런식으로 처음에 표를 그리면서 규칙을 찾으면 좀 더 효율적인 방법으로 코드를 만들수있겠구먼