#include <stdio.h>
#include <stdlib.h>
#pragma warning(disable:4996)
int compare(const void*a, const void*b) {
return(*(int*)b - *(int*)a); //내림차순
}
int check(int *arr,int n,int a){
for(int i = 0 ; i < n ; i++){
if(arr[i] != a)
return -1;
}
return 1;
}
int main() {
int n;
scanf("%d", &n);
int* arr = (int*)malloc(sizeof(int) * n);
for (int i = 0; i < n; i++) { // 와인 용량 입력
scanf("%d", &arr[i]);
}
// 용량 n-1로 맞추기
// n-1 개 잔을 골라 각 잔에 1만큼씩 따른다.
int count = 0;
for(int k = 0 ; k < n*n ; k++){
qsort(arr, n, sizeof(int), compare);
for(int i = 1 ; i < n ; i++){
arr[i]++;
}
count++;
if(check(arr,n,arr[0])==1)
break;
}
printf("%d", count);
free(arr);
return 0;
}
문제에서 주어졌던 1, 2번의 테스트 케이스는 통과하였지만 나머지 테스트 케이스에서 TimeOut이 발생함
TimeOut이 발생한 이유
가장 먼저 든 생각은 N의 범위 때문임
1 ≤ N ≤ 200,000
N이 최악일 경우의 알고리즘을 구현하는 것이 중요해 보임
시간복잡도 고려하지 않음
위와 비슷한 이유이기도 하고 보다 나은 알고리즘이 있을 것이라 생각됨
2차 시도
#include <stdio.h>
#include <stdlib.h>
#pragma warning(disable:4996)
int compare(const void*a, const void*b) {
return(*(int*)b - *(int*)a); //내림차순
}
int check(int *arr,int n,int a){
for(int i = 0 ; i < n ; i++){
if(arr[i] != a)
return -1;
}
return 1;
}
int main() {
int n;
scanf("%d", &n);
int* arr = (int*)malloc(sizeof(int) * n);
for (int i = 0; i < n; i++) { // 와인 용량 입력
scanf("%d", &arr[i]);
}
// 용량 n-1로 맞추기
// n-1 개 잔을 골라 각 잔에 1만큼씩 따른다.
int count = 0;
for(int j = 0 ; j < n ; j++){
for(int k = 0 ; k < n ; k++){
qsort(arr, n, sizeof(int), compare);
if(check(arr,n,arr[0])==1){
break;
}
for(int i = 1 ; i < n ; i++){
arr[i]++;
if(i==n-1){
count++;
}
}
}
}
printf("%d", count);
free(arr);
return 0;
}
초기 정렬 과정을 이중 for 문으로 개선하였음
테스트 3번 케이스 통과
문제점
결과적으로 삼중 for문임
시간 복잡도는 O(n^3)
3차 시도
#include <stdio.h>
#include <stdlib.h>
#pragma warning(disable:4996)
int compare(const void* a, const void* b) {
return (*(int*)b - *(int*)a); // 내림차순
}
int check(int* arr, int n, int a) {
for (int i = 0; i < n; i++) {
if (arr[i] != a)
return -1;
}
return 1;
}
int main() {
int n;
scanf("%d", &n);
int* arr = (int*)malloc(sizeof(int) * n);
for (int i = 0; i < n; i++) {
scanf("%d", &arr[i]);
}
int count = 0;
while (check(arr, n, arr[0]) != 1) {
qsort(arr, n, sizeof(int), compare);
for (int i = 1; i < n; i++) {
arr[i]++;
}
count++;
}
printf("\n필요한 최소 와인 잔 : %d", count);
free(arr);
return 0;
}