2021년 5월 14일 Algorithm, 프로그래머스, 폰켓몬
* 문제 분석
- 폰켓몬의 종류가 주어진 배열으로부터 고를 수 있는 고를 수 있는 최대한 다양한 폰켓몬의 종류를 구하는 문제이다.
- 중복된 폰켓몬은 무시하고, 서로 다른 폰켓몬을 최대한 골라야 한다.
* 문제 제한 사항과 입력 예시
- 폰켓몬의 종류가 담긴 배열 nums
가 주어진다.
- 폰켓몬의 종류가 담긴 배열 nums
의 길이는 10,000 이하의 짝수인 자연수이다.
- 폰켓몬의 종류는 1 ~ 200,000의 자연수이다.
- 다양한 폰켓몬의 종을 고르는 최대의 경우가 있을 수 있으나, 상관없이 최대로 다양한 폰켓몬을 고를 수 있는 수만 반환한다.
* 풀이
# line 2 : 고른 폰켓몬이 담길 배열이다.
# line 3 : 주어진 배열을 순회한다. 각 폰켓몬의 종류를 조회한다.
# line 4 ~ 5 : 고른 폰켓몬이 골라야 하는 폰켓몬의 최대 수보다 클 경우, 더 이상 폰켓몬을 살피지 않는다.
# line 7 ~ 8 : 만약 내가 고르지 않은 폰켓몬이 등장할 경우 고른다.
# 고른 폰켓몬의 갯수를 반환한다.
- 문제 조건에서 최대한 다양한 종류의 폰켓몬을 고를 수 있는 경우만 반환한다는 조건에 의해서 이와 같이 풀었다.
- 고르는 문제로 생각하고 combinations
를 사용하려고 했으나, test case에서 시간초과가 발생하였다.
* 개선된 풀이 방법
- 보다 더 간단한 코드를 통해 문제를 해결할 수 있다.
- 문제에서 얻을 수 있는 중요한 힌트 중 하나는 고를 수 있는 폰켓몬들의 종류가 모두 겹치지 않는다고 가정하였을 때, 문제 조건에 N // 2가지 폰켓몬을 고르는 것이 최대가 된다.
return min(len(nums) // 2, len(set(nums)))
- 위 코드와 같이 최대로 고를 수 있는 폰켓몬의 수와, 실제 배열 내에 존재하는 폰켓몬들의 종류를 비교하여, 더 작은 값을 출력하면 얻을 수 있다.
'개발 > Algorithm' 카테고리의 다른 글
[프로그래머스] 실패율(python) (0) | 2021.05.21 |
---|---|
[프로그래머스] 크레인 인형뽑기 게임(python) (0) | 2021.05.20 |
[프로그래머스] 비밀지도(python) (0) | 2021.05.19 |
[프로그래머스] 다트 게임(python) (0) | 2021.05.17 |
[프로그래머스] 약수의 개수와 덧셈(python) (0) | 2021.05.15 |