반응형
문제
풀이
내 풀이
function solution(k, tangerine) {
const arr = new Array(Math.max(...tangerine)).fill(0);
for(let i = 0; i < tangerine.length; i++) {
arr[tangerine[i] - 1]++;
}
arr.sort((a,b) => a - b);
let answer = 0;
while(k > 0) {
k -= arr.pop();
answer++;
}
return answer;
}
- 크기를 인덱스로 두어, 각 크기의 개수를 배열 arr에 담음
- arr을 오름차순으로 정렬
- arr을 pop한 값을 k만큼 빼고, answer를 더함
- 3번을 k가 양수일 때까지 계속 반복함 (많은 크기의 수부터 상자에 담아버림)
- answer를 리턴함
이번건 쉬웠다.
다른 풀이
function solution(k, tangerine) {
let answer = 0;
const dict = {};
tangerine.forEach(t => dict[t] = (dict[t] || 0) + 1);
const arr = Object.values(dict).sort((a, b) => b - a);
for (const t of arr) {
answer++;
if(k > t) k -= t;
else break;
}
return answer;
}
- dict 딕셔너리 객체에 key(귤 크기) value(수)를 담는다.
- dict의 values(수)를 내림차순으로 정렬하여 arr 배열에 담는다.
- for of 로 arr를 앞에서부터 하나씩 뽑아내서, answer+1 하는데 이걸 k가 뽑아내는 값보다 클 때까지 반복함
결국 접근 방식은 동일하다. 하지만 어느 방법이 더 효율적인지는 잘 모르겠다.
한 배열에 바로 개수를 넣고 정렬하는게 더 효율적인가, 혹은 객체에 개수들을 넣고 배열에 정렬한 값을 새로 생성하는 게 더 효율적일까?
또 while문을 사용하는게 더 효율적인가, 혹은 for of 를 사용하는게 효율적일까?
반응형
'CS > 알고리즘' 카테고리의 다른 글
[230419] 괄호 회전하기 (0) | 2023.04.19 |
---|---|
[230419] 멀리 뛰기 (0) | 2023.04.19 |
[230416] 가장 가까운 같은 글자 (0) | 2023.04.16 |
[230416] 푸드 파이트 대회 (0) | 2023.04.16 |
[230416] 점프와 순간 이동 (0) | 2023.04.16 |