일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- usedebugvalue
- react-beautiful-dnd
- 리코일
- useContext
- 위상정렬
- 알고리즘
- React
- 알고리즘 #코딩테스트 #프로그래머스 #자바
- 스티커
- recoil
- 백준
- 알고리즘 #프로그래머스 #코딩테스트 #자바스크립트
- 다이나믹프로그래밍
- 프로그래머스 #알고리즘 #자바스크립트
- useLayoutEffect
- useRef
- javascript
- 자바스크립트
- 리액트
- 드래그앤드롭
- 백준 #알고리즘 #자바스크립트
- 훅
- Suspense
- 타입스크립트
- 완전탐색
- 덕타이핑
- 프로그래머스
- Today
- Total
몽환화
[프로그래머스] Lv.2 귤 고르기 : 자바스크립트(JavaScript) 본문
문제 설명
경화는 과수원에서 귤을 수확했습니다. 경화는 수확한 귤 중 'k'개를 골라 상자 하나에 담아 판매하려고 합니다. 그런데 수확한 귤의 크기가 일정하지 않아 보기에 좋지 않다고 생각한 경화는 귤을 크기별로 분류했을 때 서로 다른 종류의 수를 최소화하고 싶습니다.
예를 들어, 경화가 수확한 귤 8개의 크기가 [1, 3, 2, 5, 4, 5, 2, 3] 이라고 합시다. 경화가 귤 6개를 판매하고 싶다면, 크기가 1, 4인 귤을 제외한 여섯 개의 귤을 상자에 담으면, 귤의 크기의 종류가 2, 3, 5로 총 3가지가 되며 이때가 서로 다른 종류가 최소일 때입니다.
경화가 한 상자에 담으려는 귤의 개수 k와 귤의 크기를 담은 배열 tangerine이 매개변수로 주어집니다. 경화가 귤 k개를 고를 때 크기가 서로 다른 종류의 수의 최솟값을 return 하도록 solution 함수를 작성해주세요.
제한사항
- 1 ≤ k ≤ tangerine의 길이 ≤ 100,000
- 1 ≤ tangerine의 원소 ≤ 10,000,000
입출력 예
k | tangerine | result |
6 | [1, 3, 2, 5, 4, 5, 2, 3] | 3 |
4 | [1, 3, 2, 5, 4, 5, 2, 3] | 2 |
2 | [1, 1, 1, 1, 2, 2, 2, 3] | 1 |
풀이 방법
그러니까 k개의 귤을 고르되 최소한의 종류로 골라야 한다,,,
우선 저 중구난방으로 들어오는 귤들을 정리를 해볼 필요가 있겠다
귤의 크기를 인덱스로 삼아서 tangerine 배열을 돌면서 해당 인덱스를 ++해주기
근데 여기서 문제 tangerine은 최대 10,000,000이라는거,..
이게 되나? 싶은 생각으로 길이 10,000,001의 배열을 만들었다
ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
아무튼 그렇게 귤의 크기별로 몇개씩 귤이 들어있는지 arr 배열을 만들었고
얘를 내림차순 정렬한 다음 앞에서부터 k개만큼 셌을 때 인덱스를 빼내면 된다
function solution(k, tangerine) {
var answer = 0;
const len = tangerine.length;
let arr = new Array(10000001).fill(0);
for(var i = 0; i < len; i++){
arr[tangerine[i]]++;
}
arr.sort((a, b) => b - a);
let cur = k;
let idx = 0;
while(cur > 0){
cur -= arr[idx];
idx++;
}
return idx;
}
이게되나 했는데 이게 됨
근데 이정도라서.... 애초에 배열 길이가 저모양인데 잘나올리가 없음ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
테스트 1 〉 | 통과 (328.02ms, 191MB) |
테스트 2 〉 | 통과 (353.87ms, 191MB) |
테스트 3 〉 | 통과 (424.17ms, 191MB) |
테스트 4 〉 | 통과 (362.20ms, 191MB) |
테스트 5 〉 | 통과 (378.60ms, 191MB) |
테스트 6 〉 | 통과 (342.28ms, 191MB) |
테스트 7 〉 | 통과 (407.60ms, 191MB) |
테스트 8 〉 | 통과 (402.11ms, 191MB) |
테스트 9 〉 | 통과 (443.39ms, 191MB) |
테스트 10 〉 | 통과 (372.04ms, 191MB) |
테스트 11 〉 | 통과 (367.62ms, 188MB) |
테스트 12 〉 | 통과 (403.29ms, 188MB) |
그래서 배열의 길이를 조정했다
function solution(k, tangerine) {
var answer = 0;
const len = tangerine.length;
const max = Math.max(...tangerine);
let arr = new Array(max + 1).fill(0);
for(var i = 0; i < len; i++){
arr[tangerine[i]]++;
}
arr.sort((a, b) => b - a);
let cur = k;
let idx = 0;
while(cur > 0){
cur -= arr[idx];
idx++;
}
return idx;
}
const max = Math.max(...tangerine); 를 사용해서
귤 크기의 최댓값 만큼만 배열을 생성했다
10,000,001의 무식한 배열보다는 납득가게 만듦 ㅎ
저렇게 해서 돌리면
테스트 1 〉 | 통과 (3.19ms, 38.9MB) |
테스트 2 〉 | 통과 (3.00ms, 39.1MB) |
테스트 3 〉 | 통과 (3.06ms, 38.9MB) |
테스트 4 〉 | 통과 (3.19ms, 38.8MB) |
테스트 5 〉 | 통과 (3.28ms, 38.8MB) |
테스트 6 〉 | 통과 (3.23ms, 38.8MB) |
테스트 7 〉 | 통과 (3.17ms, 38.7MB) |
테스트 8 〉 | 통과 (3.03ms, 38.9MB) |
테스트 9 〉 | 통과 (4.80ms, 39MB) |
테스트 10 〉 | 통과 (3.67ms, 38.9MB) |
테스트 11 〉 | 통과 (355.51ms, 185MB) |
테스트 12 〉 | 통과 (0.06ms, 33.4MB) |
좀 낫다
물론 값 커지면 어쩔 수 없긴 하다
더 최적화할 방법 없나
'알고리즘' 카테고리의 다른 글
[백준] 2011 암호코드 : 자바스크립트(node.js) (0) | 2024.04.12 |
---|---|
[백준] 19621 회의실 배정 2 : 자바스크립트(node.js) (0) | 2024.03.26 |
[백준] 1941 소문난 칠공주 : 자바스크립트(node.js) (0) | 2024.03.20 |
[백준] 11057 오르막 수 : 자바스크립트(node.js) (1) | 2024.03.19 |
[프로그래머스] Lv.2 무인도 여행 : 자바스크립트(JavaScript) (0) | 2023.12.13 |