심사위원 문제 시간복잡도 질문
안녕하세요. sorting 파트의 문제 4번 심사위원 문제의 시간복잡도 질문입니다.
정답 코드에서 score를 순회하며 getAve 함수를 호출하면서 이중 for문이 실행됩니다.
score의 최대 길이가 30만이고, k가 최대 10만이므로 시간 복잡도는 O(nk)입니다.
최악의 경우 30만 × 10만 = 300억 번 연산이 발생하는데, 이는 1~2초의 제한 시간 내에 절대 수행될 수 없으므로 시간 초과가 발생하는 코드가 맞나요?
또한 제 풀이도 평가 부탁드립니다. 누적합 배열을 사용해서 풀어봤습니다. 이러면 시간복잡도가 O(nlogn)이 나와서, 최악의 경우라도 O(90만)이라고 계산했는데, 맞을까요?
import java.util.*;
class Solution {
public int solution(int[] score, int k){
int answer = 0, n = score.length;
Arrays.sort(score);
//pre: 누적합 배열
int[] pre = new int[n];
pre[0] = score[0];
//누적합 구하기
for(int i = 1; i < n; i++){
pre[i] = pre[i-1] + score[i];
}
//score 순회하면서, 조건 만족하면 누적합 배열로 평균 구하기
for(int i = 0; i <= n - k; i++){
if(score[i + k - 1] - score[i] <= 10){
int tmp;
if(i == 0){
tmp = pre[i + k - 1];
}else{
tmp = pre[i + k - 1] - pre[i - 1];
}
tmp /= k; //평균
answer = tmp;
break;
}
}
return answer;
}
public static void main(String[] args){
Solution T = new Solution();
System.out.println(T.solution(new int[]{99, 97, 80, 91, 85, 95, 92}, 3));
System.out.println(T.solution(new int[]{92, 90, 77, 91, 70, 83, 89, 76, 95, 92}, 4));
System.out.println(T.solution(new int[]{77, 88, 78, 80, 78, 99, 98, 92, 93, 89}, 5));
System.out.println(T.solution(new int[]{88, 99, 91, 89, 90, 72, 75, 94, 95, 100}, 5));
}
}
Answer 1
1
안녕하세요^^
정답코드의 getAve 함수는 답이 발견되었을 때 딱 한 번 호출하고 프로그램이 종료됩니다.
이중 for문이 아닙니다.
님의 코드나 정답코드나 별반 차이가 없어보이나 굳이 추천을 한다면 pre 배열을 선언하고 누적합을 구해놓기 보다는 정답코드처럼 답인 구간이 발견되었을 때 그 k길이의 구간만 탐색해서 평균을 구하고 끝내는게 더 좋아을 것 같습니다.
비밀번호
0
65
1
과일 가져가기 이러한 경우에는 반례가 생기지 않나요?
0
161
2
cpu 스케줄링
0
105
2
외부 문제 질문
0
122
2
가장 많이 사용된 회의실
0
117
2
현관문 출입순서
0
96
1
미로의 최단거리 통로
0
74
1
집으로 이동 문제 코드
0
124
1
채점 사이트 개설
0
161
2
송아지를 잡자
1
110
1
다익스트라 + 환승횟수
0
135
2
문제풀이 해설 질문입니다.
0
124
2
"이동 횟수" 문제가 변형된다면?
0
155
2
예제 3번의 정답이 이해가 되지 않아요 선생님 ㅜㅜ
0
248
1
"비밀번호" 문제 확인 부탁드립니다!
0
170
1
최대 길이 연속수열 질문
0
192
1
잃어버린 강아지 문제 count 관련 질문있습니다
0
202
1
바둑대회 질문입니당
0
221
1
5. "최대 길이 바이토닉 수열" 에서 설명해주신 방법과 제가 직접 구현한 방법이 달라, 확인 한번 부탁드립니다
0
310
1
알파코드 풀이질문입니다
0
217
1
7번 비밀 번호 문제에 시간복잡도가 궁금합니다!
0
163
1
혹시 이렇게 작성해도 괜찮나요?
0
285
2
문제풀이 확인 부탁드립니다.
0
244
1
혼자서 푼 문제 확인 부탁드립니다.
0
298
1

