출처: <이것이 코딩 테스트다> - 나동빈
ex.
둘의 차이!
그리디가 더 작음 (21 > 19)
500원을 최대한 넣고, 100을 최대한 넣고, 다음다음...
큰 단위가 작은 단쉬의 배수이므로 작은 단위의 도엊ㄴ들을 종합해 다른 해가 나올 수 없기 때문에 그리디 문제!
화폐의 종류만큼 for문 시간 복잡도 : O(K)
//이렇게 작성하면 한번 반복할 때마다 나눗셈을 하는 아래 방법보다 더 오래 걸림
let count=0;
while(n!==1){ //
count++;
if(n%m===0){ n=n/m } //그리디 부분
else n--;
}
return n
더 좋은 코드
for(let i=0; i<s.length; i++){
if(S[i-1]===0){
result += S[i]//전 값이 0이면 더하기
}else if(S[i]!==0){
//해당 값이 0이 아니면 곱하기
result *= S[i]
}
return result
}
=> 1인 경우 생각 못함
첫번째 값을 빼고 첫번째와 새로 더하는 값 둘다 1보다 같거나 작은지 확인
같거나 작으면 +, 아니면 *
=> 첫번째는 처음에만 의미 있을 듯
X인 모험가는 반드시 X명 이상으로 구성한 모험가 그룹
최대 몇개의 그룹?
X : X명 (X ~ N-X 초과인 값은 모두 여기로 )
최댓값이 N-X이하여야 : N-X명 이하 (나머지 중 가장 최댓값, 위에서부터 X만큼)
function greedy(arr, N){
let count=0;
arr.sort((a,b)=>(b-a)
while(arr[0] < arr.length){ //같을 때 포함하면 밑에서 남은 arr의 길이가 0보다 클 때 합
//같거나 크면 끝남
count++;
arr = arr.slice(0, arr[0]);
}
count++;//마지막 남은 애들(같을 때, 클 때)
return count;
}
나랑 다르게 밑에서부터 만든다 : 보지 못한 조건 때문에 이런 차이 발생
"또한 몇명의 모험가는 마을에 그대로 남아 있어도 되기 때문에"
-> 즉 최댓값을 포함하지 않고, 작은 값부터 시작해야 더 많은 그룹을 만들 수 있다
공포도를 낮은 것부터 하나씩 확인
현재 그룹에 해당 모험가를 포함시키기
현재 그룹에 포함된 모험가의 수가 현재의 공포도 이상이라면, 그룹 결성
총 그룹의 수 증가시키기
현재 그룹에 포함된 모험가의 수 초기화