문제 : www.acmicpc.net/problem/11399
풀이방법
1. 시간을 기준으로 Sorting. (나는 mergeSort를 이용함)
2. 앞에서 부터, 시간을 더함(sum1). 시간을 더한 값을 또 더함(sum2) - 아래코드 참고
int sum1, sum2;
sum1 = sum2 = 0;
for (int i = 0; i < n; i++)
{
sum1 += arr[i];
sum2 += sum1;
}
코드 :
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int* mergeSort(int arr[], int left, int right);
int* merge(int arr[], int left, int mid, int right);
int main(void)
{
int n;
scanf("%d", &n);
int arr[1000];
for (int i = 0; i < n; i++)
{
scanf(" %d", &arr[i]);
}
mergeSort(arr, 0, n - 1);
int sum1, sum2;
sum1 = sum2 = 0;
for (int i = 0; i < n; i++)
{
sum1 += arr[i];
sum2 += sum1;
}
printf("%d", sum2);
return 0;
}
int* mergeSort(int arr[], int left, int right)
{
if (left == right) return arr;
int mid = (left + right) / 2;
mergeSort(arr, left, mid);
mergeSort(arr, mid + 1, right);
merge(arr, left, mid, right);
return arr;
}
int* merge(int arr[], int left, int mid, int right)
{
int i = left;
int j = mid + 1;
int k = left;
int temp[1000];
while (i <= mid && j <= right)
{
if (arr[i] > arr[j])
{
temp[k++] = arr[j++];
}
else
{
temp[k++] = arr[i++];
}
}
while (i <= mid) { temp[k++] = arr[i++]; }
while (j <= right) { temp[k++] = arr[j++]; }
for (i = left; i <= right; i++)
{
arr[i] = temp[i];
}
return arr;
}
걸린시간 : 1시간 17분 (알고리즘 : 17분, 디버깅 및 구현 : 1시간 (mergeSort구현 59분))
MergeSort를 정확하게 손에 익혀놓았다면 훨씬 빠르게 구현이 가능했었을 텐데.. 아쉽다.
몇 번 연습해봐야겠다.
'프로그래밍 > 개발 이야기' 카테고리의 다른 글
[백준] 1541번 문제풀이 (0) | 2021.04.06 |
---|---|
[백준] 13305번 문제풀이 (2) | 2021.04.06 |
[백준] 16953번 문제풀이 (0) | 2021.04.05 |
[백준] 11047번 문제풀이 (0) | 2021.04.03 |
[자료구조] Priority Queue 우선순위 큐 (0) | 2021.04.03 |
댓글