https://school.programmers.co.kr/learn/courses/30/lessons/1845
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
소스 코드
def solution(nums):
hash_dict = {str(value):nums.count(value) for value in nums}
return min(len(hash_dict),len(nums)/2)
풀이
문제의 핵심은 리스트에 존재하는 값들을 어떤 식으로 분류할 것인지에 있다고 생각하였다. 그래서 맨 처음에 생각했던 방법은 새로운 리스트를 생성하여 매개변수로 넘어온 nums 리스트의 값을 하나씩 읽어 인덱스에 카운팅 하는 방법을 생각했다.
하지만 nums 리스트에 담길 수 있는 폰켓몬의 종류 번호는 1 이상 200,000 이하라는 범위를 가지고 있는 상황에서 내가 선택한 방법으로 진행하면 리스트에 빈 인덱스가 매우 많아지고 리스트의 크기가 비 효율적으로 매우 커질 수 있다는 생각이 들었다.
따라서 키 - 값으로 바로 매핑할 수 있는 딕셔너리를 차안으로 생각하였다. 딕셔너리를 생성할 때 comprehension을 통해 키 에는 nums 리스트의 원소를 값에는 해당 원소가 리스트에 몇 개 있는지를 나타내었다.
return 값으로는 현재 폰켓몬의 종류의 개수가 nums 배열의 절반보다 클 때와 작을 때로 나누어진다. (같을 경우에는 nums/2 이므로)
작을 경우에는 폰켓몬의 개수가, 클 경우에는 최대 nums/2 만큼만 선택 가능하므로 nums/2 가 return 되어야 하므로 min 내장 함수를 사용하였다.
다른 사람의 풀이
다른 사람들의 풀이를 보면 dict이 아닌 set을 사용한 사람들이 많았다. 이 문제에서는 폰켓몬의 종류가 몇 개인지가 중요하지 해당 종류의 폰켓몬이 몇 개가 있는지는 중요하지 않다는 것을 알았다.
set을 사용하면 중복되는 값이 모두 사라지므로 최종 결과로는 dict으로 종류를 구분한 것과 같은 효과를 낼 수 있음을 깨달았다.
'Python > 알고리즘' 카테고리의 다른 글
해시 Level 1 완주하지 못한 선수 - python (프로그래머스) (0) | 2023.05.01 |
---|---|
그리디 Level 1 체육복 - python (프로그래머스) (0) | 2023.05.01 |
완전탐색 Level 1 모의고사 - python (프로그래머스) (0) | 2023.05.01 |
정렬 Level 1 K번째수 - python (프로그래머스) (0) | 2023.04.30 |
스택/큐 Level 1 같은 숫자는 싫어 - python (프로그래머스) (0) | 2023.04.30 |