문제 및 제한사항
나의 풀이
문제의 내용을 간단하게 요약하자면 다음과 같다.
사과의 가격을 나타내는 배열인 score가 주어질 때 사과를 m개씩 한상자로 묶고 m개를 충족시키지 못하는 사과는 버린다.
이 때, 사과 한 상자의 가격은 상자 내 제일 낮은 사과 가격 * m(상자 내 사과의 개수)이고 최대 이익을 낼 수 있는 방법으로 사과를 팔아야 한다.
이 문제를 보고 구상한 바는 다음과 같다.
1. 사과 상자에 담기지 않는 사과 버리기.(제일 싼걸로)
1-1. 사과를 버리기 위해 내림차순으로 사과를 정렬해 준 뒤 m의 배수가 되지 않는 사과 버리기(slice)
2. 사과 박스에 들어갈 수 있는 사과만을 남겨두었고 배열을 내림차순으로 정렬되었기 때문에 사과 한 박스 한 박스에 들어 있는 (score의) 인덱스는 0~m, m+1 ~2m, ..의 형태가 된다.
3. 따라서 상자안 가격이 가장 낮은 사과의 가격은 사과 박스 (score 인덱스 0~m, m+1 ~2m )의 가장 뒷부분인 마지막 인덱스에 들어있는 사과의 가격이기 때문에 그 사과들만 모아서 배열을 만든다.
4. 이제 이 배열은 사과의 박스 개수만큼의 인덱스를 가지며 각 element는 박스 내에서 가장 가격이 낮은 사과의 가격만 들어 있다.
5. 마지막으로 배열 요소 하나 하나를 한 박스에 들어있는 사과의 개수(m)만큼 곱해주고 더해 사과를 판 이익을 구해준다.
function solution(k,m,score) {
let answer = 0;
score.sort((a,b)=>b-a);
let newArr = score.slice(0,score.length-score.length%m);
const filteredArr = newArr.filter((el,idx)=>{
if(idx%m===m-1){
return el;
}
})
filteredArr.forEach((el)=>{
answer += el*m;
})
return answer;
};
과정①
: 사과의 개수가 m으로 나누어 떨어지지 않는다면 버리는 사과가 생기기 때문에 최대의 이익을 내기 위해 내림차순 정렬을 해준 뒤 사과 가격이 가장 낮은 사과들만 버렸다.
가격을 내림차순 정렬을 해준 이유는, '가격이 낮은 사과'를 기준으로 상자의 가격을 책정한다는 문제의 조건이 있었기 때문이다. 만약 가격이 높은 사과를 기준으로 상자의 가격을 책정했다면, 모든 박스에 가격이 제일 높은 사과를 한개씩 넣어야하는 완전히 다른 문제가 되었겠지만 반대로 가격이 낮은 사과가 기준이기 때문에 위와는 반대의 논리로 가격이 낮은 사과들을 최대한 한 박스에 몰아넣기 위해 내림차순으로 정렬해준 것이다.
사과를 버린 이유는 앞으로 내가 따로 사과 상자를 만드는 코드를 짜지 않기 위해 버렸다.
사과 상자를 굳이 안만들더라도 배열의 인덱스를 이용해 0~4까지 1박스, 5~8까지 2박스, ... 이런식으로 박스를 임의적으로 정의해주고 문제를 풀면 되었기 때문이다.
(이 때 사과를 미리 버려주지 않는다면 사과 박스에 들어갈 수 없는 사과들의 인덱스까지도 포함되어 계산되는 실수가 생길수도 있기 때문이다)
과정②,③
: 과정 1에서 사과를 버렸기 때문에 score 배열 안에 있는 m번째 바로 전 인덱스의 사과는 박스내에서 가장 가격이 낮은 사과이다. 따라서 이 사과들만 모아 배열을 만들어주었다. 배열의 형태로 만들어준 이유는 상자 박스별 가격을 책정하기 위해 forEach를 쓰려고 일부러 만들어줬다.
과정④,⑤
: 마지막으로 필터링된 배열의 각 요소를 상자 내의 사과 개수만큼 곱해주고 더해주어 전체의 이익을 계산했다.
'Algorithm' 카테고리의 다른 글
기사단원의 무기 [프로그래머스] (1) | 2023.10.30 |
---|---|
소수 찾기 [프로그래머스] (0) | 2023.10.29 |
폰켓몬 [프로그래머스] (0) | 2023.10.22 |
2016년 [프로그래머스] (1) | 2023.10.20 |
카드 뭉치 [프로그래머스] (1) | 2023.10.19 |