🤯 코딩테스트/C/C++
[it 취업을 위한 알고리즘 문제풀이 (with C/C++) : 코딩테스트 대비] 코드구현력 기르기 - 온도의 최대값
kangkibong
2022. 8. 26. 18:45
문제
매일 아침 9시에 학교에서 측정한 온도가 어떤 정수의 수열로 주어졌을 때, 연속적인 며칠 동안의 온도의 합이 가장 큰 값을 알아보고자 한다.
매일 측정한 온도가 정수의 수열로 주어졌을 때, 연속적인 며칠 동안의 온도의 합이 가장 큰 값을 계산하는 프로그램을 작성하시오.
💡 입력설명
첫째 줄에는 두 개의 정수 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>
int main() {
int n, k, i, j, max = -2147000000, sum;
scanf("%d %d", &n, &k);
int arr[n] = {0, };
for(i = 0; i < n; i++) {
scanf("%d", &arr[i]);
}
for(i = 0; i <= n - k; i++) {
sum = 0;
for(j = i; j < i + k; j++) {
sum += arr[j];
}
if(sum > max) {
max = sum;
}
}
printf("%d", max);
return 0;
}
최종 풀이
#include <stdio.h>
#include <vector>
int main() {
int n, k, i, j, max = -2147000000, sum = 0;
scanf("%d %d", &n, &k);
std::vector<int> arr(n);
for(i = 0; i < n; i++) {
scanf("%d", &arr[i]);
}
for(i = 0; i < k; i++) {
sum += arr[i];
}
for(i = k; i <= n - 1; i++) {
sum = sum + arr[i] - arr[i - k];
if(sum > max) {
max = sum;
}
}
printf("%d", max);
return 0;
}
설명
사용자로부터 n(날짜), k(연속적인 날짜)를 입력받고 n만큼의 vector arr을 선언한다.
n번 반복하는 for문을 작성하여 해당 arr에 온도를 입력받는다.
k번 반복하는 for문을 작성하여 sum값에 미리 할당받는다.
이후 k부터 n-1만큼 반복하는 for문을 작성하여 sum에 다음 날짜의 온도를 더하고 k이전의 온도를 빼나간다.
해당 sum값이 max보다 클 경우 max에 sum을 할당해 나간다.
해당 for문에서 빠져나오면 max를 출력하여 마무리한다.
배운 점
1. 동적메모리 할당: vector
#include <vector> int main () { int n; scanf("%d", &n); // n크기의 메모리 할당 std::vector<int> a(n); }
- 배열을 사용할 경우 int *arr=new int[n] 로 new 연산자를 써서 동적으로 할당받아야한다.
- 동적할당 해제는 delete[] arr; 하면 할당이 해제된다.
- 요즘은 배열을 쓰지 않고 벡터를 쓰는 경향이 있다.
2. 2중 for문을 사용하여 풀다보니 시간복잡도 O(n^2)으로 인한 time_limit가 발생하였다.
해당 문제를 Slicing Window 기법을 활용하면 시간복잡도를 O(n)으로 줄일 수 있다는 것을 알게되었다.
해당 내용은 김태원님의 'it 취업을 위한 알고리즘 문제풀이' 강의를 듣고 작성한 글입니다.