0503-daliyAlgorithm
프로그래머스
level3 야근지수
design
처음에 설계는 가장 큰 수를 찾아서 overWorkTime을 하나씩 빼주고
다시 가장 큰 수를 찾아서 overWorktime에서 하나를 빼주고 이 과정을
overWorkTime이 0이면 worksList를 돌면서 남아있는 worksList의 제곱 합을 구해주고
worksList item이 0인경우에는 -> worksListItem을 shift로 빼준다.
worksList Length가 0인 경우1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84다른사람 풀이 초보몽키님 파이썬이지만
def noOvertime(n, works):
if n >= sum(works):
return 0
while n > 0:
works[works.index(max(works))] -= 1
n -= 1
result = sum([i*i for i in works])
# 야근 지수를 최소화 하였을 때의 야근 지수는 몇일까요?
return result
sum으로 조건을 거른 점이 좋았다.
if(works.length===0) return 0;
if(overWork===0) return getSumPow(works) 나의 경우는 이런 부분을 계속 했는데 굳이...
나의 풀이
다이나믹...
계속 sorting을 안 하려면..
동적으로 계속 최대값을 기록하고, 또 최대값이 0인 경우 같은 숫자들로 기록하고 , 또 같은 숫자들 중에서
빼주고 줄여주고 ... 이렇게 해줘야 되는데 ... 시도해보다가 잘 안 되서 그냥 단순한 방법으로 풀었다.
단순히 gap이 1보다 클 때는 한 번에 해주기 위해서 if-else가 좀 더 들어갔는데
const getSumPow = (list)=> list.reduce((ac,c)=>{
ac+=Math.pow(c,2)
return ac;
},0)
function noOvertime(overWork, works) {
if(works.length===0) return 0;
if(overWork===0) return getSumPow(works)
works.sort((a,b)=>b-a);
const gap = works[0]-works[1]
if(overWork<=gap){
works[0]-=overWork
overWork=0;
}
else{
overWork-=gap
works[0]-=gap
}
if(overWork){
overWork-=1
works[0]-=1
}
else return getSumPow(works)
if(works[0]===0) works.shift()
return noOvertime(overWork, works);
}
const getOverTime = (overWork, works)=>{
works.sort((a,b)=>b-a);
const gap = works[0]-works[1]
if(overWork<=gap){
works[0]-=overWork
overWork=0;
}
else{
overWork-=gap
works[0]-=gap
}
if(overWork===0) return getSumPow(works)
else getOverTime((overWork, works)
}
function noOvertime(overWork, works) {
if(overWork<=works.reduce((ac,c)=>ac+c,0)) return 0;
else return getOverTime(overWork, works)
}
근데 결국 이렇게 정리해도 1이 아닐 때만 좀 더 빨리 연산 해주는 것이구 ...
sort()를 계속 안 해주는 방법으로 구한 사람
var index = works.indexOf(Math.max.apply(null, works));
works[works.indexOf(Math.max(...works)]-=1;
// 최대값을 찾는 것이 더 빠를 것 같은데 ... 최대값을 찾고 또 index로 찾은 다음 연산을 해주어야 되나?...
//Max 만 찾는 것이 더 빠르긴 할 텐데 그 값을 또 찾아주는 거랑 sorting해서 [0]으로 접근하는 거랑 별 차이가 없어보이는...
// var works = [...Array(100000).keys()];
// works[works.indexOf(Math.max(...works))]-=1;
//단순 계산으로는 시간 차이가 거의 없었는데 위에서는 works를 너무 많이 불러서 1000000번을 넘어가니 maximumCallStack이 나온다.
// var works = [...Array(10000000).keys()];
// works.sort()[0]-=1;
내일 동적으로 처리해보는 아이디어도 30분~1시간 정도
잘 안 되서 다른 사람 풀이를 통해서 알아보려 했는데 ‘ㅁ’;; 다른 사람들도 sort나 Max값을 찾는 것의 반복으로 풀었다.
Codility 07-02
코딜리티 0702는 결국 또 못 하다니 … 내일은 코딜리티 부터 합시다.
우와 한글이다 하면서… 프로그래머스 문제 부터 풀게 된다.