JS> [Programmers] 폰켓몬

OwlCJ·2022년 2월 13일
0

문제풀이

목록 보기
1/3
post-thumbnail

프로그래머스에 존재하는 수많은 문제중에 오늘은 좀 흥미로워 보이는 문제를 풀이해봤다.🧐 문제 이름은 폰켓몬 이었는데 내용은 다음과 같다.

문제 설명

당신은 폰켓몬을 잡기 위한 오랜 여행 끝에, 홍 박사님의 연구실에 도착했습니다. 홍 박사님은 당신에게 자신의 연구실에 있는 총 N 마리의 폰켓몬 중에서 N/2마리를 가져가도 좋다고 했습니다.
홍 박사님 연구실의 폰켓몬은 종류에 따라 번호를 붙여 구분합니다. 따라서 같은 종류의 폰켓몬은 같은 번호를 가지고 있습니다. 예를 들어 연구실에 총 4마리의 폰켓몬이 있고, 각 폰켓몬의 종류 번호가 [3번, 1번, 2번, 3번]이라면 이는 3번 폰켓몬 두 마리, 1번 폰켓몬 한 마리, 2번 폰켓몬 한 마리가 있음을 나타냅니다. 이때, 4마리의 폰켓몬 중 2마리를 고르는 방법은 다음과 같이 6가지가 있습니다.
첫 번째(3번), 두 번째(1번) 폰켓몬을 선택
첫 번째(3번), 세 번째(2번) 폰켓몬을 선택
첫 번째(3번), 네 번째(3번) 폰켓몬을 선택
두 번째(1번), 세 번째(2번) 폰켓몬을 선택
두 번째(1번), 네 번째(3번) 폰켓몬을 선택
세 번째(2번), 네 번째(3번) 폰켓몬을 선택
이때, 첫 번째(3번) 폰켓몬과 네 번째(3번) 폰켓몬을 선택하는 방법은 한 종류(3번 폰켓몬 두 마리)의 폰켓몬만 가질 수 있지만, 다른 방법들은 모두 두 종류의 폰켓몬을 가질 수 있습니다. 따라서 위 예시에서 가질 수 있는 폰켓몬 종류 수의 최댓값은 2가 됩니다.
당신은 최대한 다양한 종류의 폰켓몬을 가지길 원하기 때문에, 최대한 많은 종류의 폰켓몬을 포함해서 N/2마리를 선택하려 합니다. N마리 폰켓몬의 종류 번호가 담긴 배열 nums가 매개변수로 주어질 때, N/2마리의 폰켓몬을 선택하는 방법 중, 가장 많은 종류의 폰켓몬을 선택하는 방법을 찾아, 그때의 폰켓몬 종류 번호의 개수를 return 하도록 solution 함수를 완성해주세요.

제한사항
nums는 폰켓몬의 종류 번호가 담긴 1차원 배열입니다.
nums의 길이(N)는 1 이상 10,000 이하의 자연수이며, 항상 짝수로 주어집니다.
폰켓몬의 종류 번호는 1 이상 200,000 이하의 자연수로 나타냅니다.
가장 많은 종류의 폰켓몬을 선택하는 방법이 여러 가지인 경우에도, 선택할 수 있는 폰켓몬 종류 개수의 최댓값 하나만 return 하면 됩니다.
입출력 예
nums result
[3,1,2,3] 2
[3,3,3,2,2,4] 3
[3,3,3,2,2,2] 2

입출력 예 설명
입출력 예 #1
문제의 예시와 같습니다.
입출력 예 #2
6마리의 폰켓몬이 있으므로, 3마리의 폰켓몬을 골라야 합니다.
가장 많은 종류의 폰켓몬을 고르기 위해서는 3번 폰켓몬 한 마리, 2번 폰켓몬 한 마리, 4번 폰켓몬 한 마리를 고르면 되며, 따라서 3을 return 합니다.
입출력 예 #3
6마리의 폰켓몬이 있으므로, 3마리의 폰켓몬을 골라야 합니다.
가장 많은 종류의 폰켓몬을 고르기 위해서는 3번 폰켓몬 한 마리와 2번 폰켓몬 두 마리를 고르거나, 혹은 3번 폰켓몬 두 마리와 2번 폰켓몬 한 마리를 고르면 됩니다. 따라서 최대 고를 수 있는 폰켓몬 종류의 수는 2입니다.

출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges

문제설명이 긴 편에 속하지만 간단히 정리해서 짝수의 nums라는 배열이 주어지는데 그 안에는 중복가능한 폰켓몬들의 종류가 들어 있다. nums배열 길이의 반만큼 폰켓몬을 가질 수 있다. 최대한 여러 종류의 폰켓몬을 가져야 한다. 리턴할 answer값의 수로는 최대 고를수 있는 포켓몬의 종류 값이다.

해당 문제에 대한 나의 풀이는 다음과 같다.

나의 문제풀이

function solution(nums) {
    var answer = 0;
    let pickNums = nums.length / 2;
    let myPhoneKeMons = []
    
    nums.forEach( (phoneKeMon) => {
        if ( myPhoneKeMons.length < pickNums ) {
            myPhoneKeMons.includes(phoneKeMon) || myPhoneKeMons.push(phoneKeMon);
        }
    });
    
    answer = myPhoneKeMons.length;
    return answer;
}

일단 가질수 있는 최대 수를 pickNums 라는 변수에 할당하고 myPhoneKeMons 라는 배열을 선언해 가지게되는 폰켓몬 종류 값을 저장해주기로 했다. forEach를 사용해 nums배열의 값들을 순환하며 가진 폰켓몬의 갯수가 최대치가 되기전까지 계속해서 해당 폰켓몬을 가졌는지 확인하고 없다면 푸쉬해주는 로직으로 만들었다. 최근에 학습한 단락 평가를 사용해 푸쉬하는 것을 구현해봤다. 최종적으로는 총 가진 폰켓몬의 갯수를 answer에 담아 리턴해준다.

마무리

난이도가 어려운 문제는 아니었지만, 문제 풀이가 끝나고 다른 사람들의 풀이를 보니 set을 활용해 간단히 풀이를 한 것이 눈에 띄었다. 생각해보니 set을 사용하면 여러 반복과 조건을 거치지 않고도 효과적으로 중복된 데이터를 정리할 수 있는데 문제 풀이 당시에는 전혀 생각하지 못했다.🤔

기본적으로 배우는 것들의 특징을 잘 활용해서 좋고 빠른 결과를 만들 수 있다는 점을 기억해야 될듯✍🏻

profile
ios 개발자를 목표로 성장중입니다 🧐

0개의 댓글