본문 바로가기

CS/알고리즘

[230417] 귤 고르기

반응형

 

 

문제

 

 

풀이

내 풀이

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;
}
  1. 크기를 인덱스로 두어, 각 크기의 개수를 배열 arr에 담음
  2. arr을 오름차순으로 정렬
  3. arr을 pop한 값을 k만큼 빼고, answer를 더함
  4. 3번을 k가 양수일 때까지 계속 반복함 (많은 크기의 수부터 상자에 담아버림)
  5. 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;
}
  1. dict 딕셔너리 객체에 key(귤 크기) value(수)를 담는다.
  2. dict의 values(수)를 내림차순으로 정렬하여 arr 배열에 담는다.
  3. 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