코테 및 알고리즘

프로그래머스 - 귤 고르기

Jay_Jung 2024. 8. 6. 10:52

<문제>

https://school.programmers.co.kr/learn/courses/30/lessons/138476

 

프로그래머스

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

programmers.co.kr

 

<문제 핵심>

1. 딕셔너리 자료구조를 사용해서 배열에 존재하는 숫자의 중복갯수를 구한다.
-> 배열을 순회 하면서 이미 객체에 있는 값이 들어오면 존재하는 value에 +1시켜주고, 없는 값이 들어오면 객체에 값을 넣어줌과 동시에 1로 초기화 해주기

2. Object 관련 메소드 숙지(대표적 3가지)

Object.keys(obj)
– 객체의 키만 담은 배열을 반환한다.

Object.values(obj)
 – 객체의 값만 담은 배열을 반환한다.

Object.entries(obj)
 – [키, 값] 쌍을 담은 배열을 반환합니다. -> 2차원 배열 의미

 

3. Map 자료구조를 활용해도 됌

map.keys() – 각 요소의 키를 모은 반복 가능한(iterable, 이터러블) 객체를 반환한다.

map.values() – 각 요소의 값을 모은 이터러블 객체를 반환한다.

map.entries() – 요소의 [키, 값]을 한 쌍으로 하는 이터러블 객체를 반환한다. 이 이터러블 객체는 for..of반복문의 요소로도 활용한다.

<Map의 기본 형태 : 이터러블 객체>

❗Map은 배열이 아니라는 점 주의

freq = {
  1 => 3,
  2 => 5,
  3 => 2
}

<Map 자료구조 참고 레퍼런스>

https://inpa.tistory.com/entry/JS-%F0%9F%93%9A-%EC%9E%90%EB%A3%8C%ED%98%95-Map-%F0%9F%9A%A9-%EC%A0%95%EB%A6%AC#%EA%B0%9D%EC%B2%B4_-%3E_%EB%A7%B5_%EC%9C%BC%EB%A1%9C_%EB%B0%94%EA%BE%B8%EA%B8%B0

 

[JS] 📚 자바스크립트 자료형 Map 🚩 정리

자바스크립트는 객체와 배열이라는 강력한 자료구조를 제공합니다. ​객체 – 키가 있는 컬렉션을 저장함 배열 – 순서가 있는 컬렉션을 저장함 ​하지만 현실 세계를 반영하기엔 이 두 자료구

inpa.tistory.com

 

<문제 풀이과정 및 순서도>

✅ freq라는 맵 생성

✅ tangerine[i]가 key, 키에 해당하는 빈도수를 값으로 설정하여 freq객체에 빈도수를 카운트 해준다.

✅ freq 맵에서 값 들만 가져와서 배열로 반환해주기 + freq객체의 값(빈도 수)을 내림차순으로 정렬해 빈도수가 높을수록 앞에 위치하도록 정렬한다.

for문을 통해 반복하면서 해당 빈도수를 k에서 빼주고 이를 k가 0보다 작거나 같을때까지 반복한다.

function solution(k, tangerine) {
    const freq = new Map();
    for(let i = 0; i < tangerine.length; i++) {
        const target = freq.get(tangerine[i])//키에 해당하는 값 가져오기
        freq.set(tangerine[i], target ? target + 1 : 1)
    }
    
    const val = Array.from(freq.values()).sort((a, b) => b - a);
    let count = 0;
    
    for(let i = 0; i < val.length; i++) {
        if(k <= 0) break;
        
        k -= val[i]
        count++
    }

    return count;
}

 

<전체 코드>

function solution(k, tangerine) {
    const freq = new Map();
    for(let i = 0; i < tangerine.length; i++) {
        const target = freq.get(tangerine[i])//키에 해당하는 값 가져오기
        freq.set(tangerine[i], target ? target + 1 : 1)
    }
    
    const val = Array.from(freq.values()).sort((a, b) => b - a);
    let count = 0;
    
    for(let i = 0; i < val.length; i++) {
        if(k <= 0) break;
        
        k -= val[i]
        count++
    }

    return count;
}