[Javascript] ponketmon - 프로그래머스

공태윤·2024년 2월 3일

코딩테스트

목록 보기
3/9
post-thumbnail

문제

문제가 길어 link로 걸어두고 밑에는 문제를 풀기 위한 간단한 설명을 하겠습니다.

링크 : https://school.programmers.co.kr/learn/courses/30/lessons/1845?language=javascript

문제 설명

배열 nums를 파라미터로 전달 받습니다.

Ex ) nums : [3, 1, 2, 3]

배열에는 포켓몬의 번호가 달려있습니다.

즉,
3번 포켓몬 : 2개
1번 포켓몬 : 1개
2번 포켓몬 : 1개

이 중 N/2개인 2개를 주어야 합니다.

주어야 하는 포켓몬 중 최대한 겹치지 않게 주는 포켓몬의 종류를 구하는 문제입니다.

문제 분석

생각보다 간단한 문제입니다.

링크 : https://velog.io/@gomteng03/JavaScript-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%B5%9C%EB%B9%88%EA%B0%92-%EA%B5%AC%ED%95%98%EA%B8%B0

최빈값을 구하는 문제와 사실상 유사하다고 볼 수 있습니다.

만약, 포켓몬의 종류보다 주어야 하는 개수가 많다면 포켓몬을 다 다른 종류대로 줄 수 있다는 것입니다.

따라서 N/2개의 서로 다른 포켓몬을 줄 수 있다는 것입니다.

그렇지 않고, 포켓몬의 종류가 주어야 하는 포켓몬보다 작다면 줄 수 있는 종류는 포켓몬의 종류일 것입니다.

즉, 포켓몬의 있는 종류 다 주면 됩니다.

같다면 어떨까요 ? 포켓몬 종류를 다 주든 N/2개의 서로 다른 포켓몬을 주든 상관이 없을 것입니다.

예시

Ex 1 )

[3, 1, 2, 3]
1 : 1
2 : 1
3 : 2
N/2 : 2
즉, 1, 2, 3 중 아무거나 주어도 된다는 것입니다.
N/2만 만족하면 되므로 2개를 줄 수 있습니다.

Ex 2 )

[1, 1, 1, 2, 2, 2]
1 : 3
2 : 3
N/2 : 3
3개를 주어야 하지만 종류가 2개 밖에 없습니다. 따라서 줄 수 있는 포켓몬의 종류는 2입니다.

자료구조 (map)

사용할 자료구조는 map입니다.

Reference

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Map

배열을 순회하며 map에 데이터를 넣으면 됩니다.
그러면 예제와 같이 데이터가 저장이 될 것입니다.

그리고 조건 연산을 사용하면 문제를 쉽게 풀 수 있습니다.

코드

function solution(nums) {
    const map = new Map();
    nums.forEach((i) => map.set(i, map.get(i) ?? 0)+1);
    return map.size <= nums.length/2 ? map.size : nums.length/2;
}
profile
기록으로 성장하는 프론트엔드 개발자입니다!

0개의 댓글