티스토리 뷰

 

2022.11.24

프로그래머스 스쿨 Lv01. 과일 장수 


 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

🚀 문제 파악

* 사과는 1점~k점으로 품질 분류
* 한 상자에 사과 m개씩 포장
* 상자의 사과 중 가장 낮은 점수는 p
* 사과 한 상자의 가격은 p*m
* 가능한 많은 사과를 팔고 최대 이익 얻기

**(예)
* 최대점 3점, 사과 한상자에 4개씩 포장
* 사과 7개의 점수가 score = [1,2,3,1,2,3,1] 의 경우
* 한 상자에 [2,3,2,3] 을 넣어 판매해 최대 이익 

* (최저 사과 점수) x (한 상자에 담긴 사과 개수) x (상자의 개수) = 2 x 4 x 1 = 8

 

 

🚀 문제 해결 방법(1) 내림차순 정렬 후, splice()

1. 사과의 점수가 담긴 배열 score를 내림차순 정렬한다.

    *내림차순 정렬하는 방법(1) sort() 후 reverse()

      이 방법은 사전에서 단어 찾듯 첫 글자부터 확인하므로 숫자 정렬에는 적합하지 않다

    *내림차순 정렬하는 방법(2) sort() 의 콜백함수를 활용

      Array.sort((a,b) => b-a)

      a는 인덱스 앞 순서 요소, b는 인덱스 뒷 순서 요소

      b-a의 값이 양수면 b를 왼쪽으로, a를 오른쪽으로 (버블정렬과 비슷한가?)

2. 정렬한 score배열을 m개씩 나눈다. / splice() 사용

3. 나눈 배열 중 length가 m개인 배열에서의 최소 값을 찾아 합한다.

 

🔥 실패 (테스트 11~15 시간초과)

function solution(k, m, score) {
    var answer = 0;
    // score배열 내림차순 정렬
    score.sort( (a,b) => b-a );
    
    var cnt = parseInt(score.length/m);
    for(var i = 1; i <= cnt; i++){
    	// m-1번째 요소는 항상 최소값 (이미 정렬된 배열을 splice()했으므로)
        answer += score.splice(0,m)[m-1]*m;
    }
    return answer;
}

 

 

🚀 문제 해결 방법(2) 내림차순 정렬 후 m-1번째 값을 구해 모두 합하기

1. 사과의 점수가 담긴 배열 score를 내림차순 정렬한다.

2. 정렬한 score배열의 m-1번째 값을 모두 구해 합한다

(예) score = [ 5,4,3,2,1] / m = 2 인 경우 4,2 의 합을 반환한다 

 

🚀 통과 코드

function solution(k, m, score) {
    var answer = 0;
    score.sort((a,b) => b-a);
    for(var i = 1; i <= score.length/m; i++){
        var idx = i*m-1;
        answer += score[idx]*m;
    }
    return answer;
}

 

 

댓글
«   2024/12   »
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
최근에 올라온 글
글 보관함
Total
Today
Yesterday