🔗 문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/1845?language=python3
📰 문제 요약
문제 설명, 입력, 출력, 조건 등 간략하게 정리
문제 설명
폰켓몬은 종류에 따라 번호를 붙여서 구분 (따라서, 같은 종류의 폰켓몬은 번호가 같음)
N 마리의 폰켓몬 중에서 N/2마리를 가져가도 될 때, 최대한 많은 종류의 폰켓몬을 포함해서 N/2마리를 선택하고자 함
입력
N마리 폰켓몬의 종류 번호가 담긴 배열 nums
- nums : 폰켓몬의 종류 번호가 담긴 1차원 배열
- nums의 길이 (N)은 1 ≤ N ≤ 10,000 (항상 짝수)
- 1≤ 종류 번호 ≤ 200,000 (자연수)
출력
N/2마리의 폰켓몬을 선택하는 방법 중, 가장 많은 종류의 폰켓몬을 선택하는 방법을 찾아, 그때의 폰켓몬 종류 번호의 개수를
🔓 문제 접근 방식
기본 아이디어
- 해시를 사용해서 중복값을 제거하여 현재 포켓몬의 종류 수 a를 알아낸다.
- 해당 종류 수가 N/2보다 크다면, 답은 N/2
- 해당 종류 수가 N/2보다 작다면, 답은 종류 수 a
사용 알고리즘
- 해시
💻 구현 방법
- 중복을 제외하고 순수한 종류만 한 리스트로 만들기
- 해당 리스트의 수를 가지고 갈 폰켓몬 수와 비교
- 비교 후 적절한 값 출력
👍🏻 최종 제출 코드
def solution(nums):
answer = 0
N = len(nums) # 총 폰켓몬 수
seen = [] # 폰켓몬 종류를 담을 리스트
for num in nums :
if num in seen : # 만약 중복된 폰켓몬일 경우
continue # 넘어감
else : # 새로운 폰켓몬일 경우
seen.append(num) # 리스트에 추가
if len(seen) >= N/2 : # 폰켓몬 종류가 가지고 갈 폰켓몬보다 클 때
answer = N/2 # 최대값은 가지고 갈 폰켓몬 수
else : # 폰켓몬 종류가 가지고 갈 폰켓몬보다 적을 때
answer = len(seen) # 최대값은 폰켓몬 종류
return answer
📝 새로 학습한 내용
다른 사람의 풀이를 참고해 봤을 때, 정말 간결했다
def solution(ls):
return min(len(ls)/2, len(set(ls)))
set 형태로 입력 받으면 그냥 중복이 제거가 된 전체 개수가 출력되고, 내가 복잡하게 if-else 문으로 비교한 부분을 간단하게 min을 사용해서 둘 중 최솟값으로 하면 되는 것을 알 수 있었다.
'Problem Solving > 프로그래머스 (Programmers)' 카테고리의 다른 글
| [프로그래머스] K번째 수 (0) | 2025.02.02 |
|---|---|
| [프로그래머스] 더 맵게 (0) | 2025.02.02 |
| [프로그래머스] 기능개발 (0) | 2025.01.19 |
| [프로그래머스] 같은 숫자는 싫어 (0) | 2025.01.18 |
| [프로그래머스] 완주하지 못한 선수 (0) | 2025.01.11 |
