알고리즘/it 취업을 위한 알고리즘 문제풀이

22. 온도의 최대값

고줭 2021. 5. 18. 15:28

문제

매일 아침 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


#include <stdio.h>
#include <vector>

int main(){
	//freopen("input.txt", "rt", stdin);
	int i, n, k, max, sum=0;
	scanf("%d %d", &n, &k);
	std::vector<int> temperature(n);
	
	for(i=0; i<n; i++){
		scanf("%d", &temperature[i]);
	}
	
	for(i=0; i<k; i++){
		sum += temperature[i];
	}
	max = sum;
	
	for(i=k; i<n; i++){
		sum = sum + temperature[i] - temperature[i-k];
		if(sum > max){
			max = sum;
		}
	}
	printf("%d", max);
	
	return 0;
}

문제를 접하고 이중for문을 생각해서 로직을 짯습니다. 그치만 주어지는 n, k의 값이 크면 1초는 턱없이 부족하게 돼버리기때문에 다른방법으로 찾아야합니다.

cpp로 코테를 준비하면서 배열보다는 벡터를 많이 사용했는데 드디어 등장했네요.
vector는 배열과 달리 자동으로 메모리가 할당된다고하는데 자세한건 잘 모르겠지만 굉장히 좋다는것만 알면될것같습니다.

벡터를 입력값 n만큼 크기를 설정하고 각 인덱스에 입력값을 집어넣습니다.
후에 0번 인덱스부터 k-1만큼의 인덱스만큼을 더하고 max를 sum값으로 초기화합니다. 후에 k번 인덱스를 더하고 i-k를 빼면 우리가 원하는 범위만큼의 값을 얻게됩니다.

첨 생각한 방법처럼 첨부터 끝까지 완수하는 코드말고 첫부분을 미리 해놓고 나중부분을 차례대로하는 생각에 뒷통수 세게 맞은듯 얼얼합니다

'알고리즘 > it 취업을 위한 알고리즘 문제풀이' 카테고리의 다른 글

24. Jolly Jumpers <algorithm>  (0) 2021.05.19
23. 연속 부분 증가수열  (0) 2021.05.18
21. 카드게임  (0) 2021.05.17
20. 안내면 진거~ 가위바위보!  (0) 2021.05.17
19. 분노 유발자  (0) 2021.05.17