프로그래머스 LV2 귤 고르기
// *객체를 만들어 크기별 귤 갯수 정리하기
// *해당 숫자가 없으면 key 만들고 value는 1
// *해당 숫자가 있으면 해당 value +1
//객체가 완성되면 키값은 무시하고 value만으로 이루어진 배열 재생성(내림차순 정렬)
// 가장 큰 value부터(앞에서부터) k에서 뺀다. type++
// k가 0 이하가 되면 return type
위의 과정으로 알고리즘 문제를 해결했다.
*부분을 위해 배열을 순회하여 객체로 정리하는 로직이 필요했다.
tangerine.forEach((size)=>{
if(tangObj[size])tangObj[size]++
else tangObj[size] = 1;
})
나는 forEach를 이용해 tangerine이라는 배열을 순회해 tangObj를 생성했다.
1.tangObj에 해당 요소 키가 이미 존재한다면 키에 해당하는 값에 1을 더한다.
2. 존재하지 않는다면 값을 1로 하여 생성한다.
다른 사람의 풀이를 참고하여 다른 방법으로도 풀어보았다.
1. for of 반복문 사용하기
2. reduce 메서드만 사용하기
for (const value of tangerine) {
tangObj[value] = (tangObj[value] || 0) + 1;
}
foeEach와 거의 비슷한 방법이다.
추가로 || 논리연산자를 사용하여 if/else 없이 간결하게 코드를 작성할 수 있었다.
const tangObj = tangerine.reduce((acc, value) => {
acc[value] = (acc[value] || 0) + 1;
return acc;
}, {});
reduce 메서드의 두 인자를 콜백 함수와 초기 누적 값으로 설정한다.
콜백 함수는 각 배열 요소를 객체의 키로 가지는 프로퍼티를 생성한다.
콜백 함수는 누적 객체에 해당 요소 키가 이미 존재하는지 확인하고, 존재하면 해당 값에 1을 더한다. 존재하지 않으면 값을 1로 초기화한다.
누적 객체(tangObj)를 반환한다.
function solution(k, tangerine) {
let type = 1;
let tangObj = {};
tangerine.forEach((num)=>{
if(tangObj[num])tangObj[num]++
else tangObj[num] = 1;
})
const tangValue = Object.values(tangObj).sort((a, b) => b - a);
tangValue.forEach((num)=>{
k -= num;
if(k-num <=0){
return;
}
else {
type++;
}
})
return type;
}```
잘 봤습니다. 좋은 글 감사합니다.