2024. 7. 6. 18:00ㆍ코딩테스트 입문
https://school.programmers.co.kr/learn/courses/30/lessons/120812
문제 설명
최빈값은 주어진 값 중에서 가장 자주 나오는 값을 의미합니다. 정수 배열 array가 매개변수로 주어질 때, 최빈값을 return 하도록 solution 함수를 완성해보세요. 최빈값이 여러 개면 -1을 return 합니다.
제한사항
- 0 < array의 길이 < 100
- 0 ≤ array의 원소 < 1000
입출력 예
array | result |
[1, 2, 3, 3, 3, 4] | 3 |
[1, 1, 2, 2] | -1 |
[1] | 1 |
입출력 예 설명
입출력 예 #1
- [1, 2, 3, 3, 3, 4]에서 1은 1개 2는 1개 3은 3개 4는 1개로 최빈값은 3입니다.
입출력 예 #2
- [1, 1, 2, 2]에서 1은 2개 2는 2개로 최빈값이 1, 2입니다. 최빈값이 여러 개이므로 -1을 return 합니다.
입출력 예 #3
- [1]에는 1만 있으므로 최빈값은 1입니다.
최빈값을 구하는 문제입니다.
조금 특이한 점이라면, 최빈값이 중복될 수도 있다는 점입니다. 만약 최빈값이 2개 이상이면 -1을 반환해야 합니다.
이래서 이 문제는 statistics 패키지의 mode를 사용할 수 없습니다. mode는 첫 번째로 나온 최빈값을 반환하기 때문입니다.
저는 collections 패키지의 Counter을 사용해 문제를 풀어보겠습니다.
from collections import Counter
def solution(array):
count = Counter(array)
# 횟수 세기
max_count = max(count.values())
# 가장 많은 횟수를 가지는 값들 찾기
most_common = [key for key, value in count.items() if value == max_count]
# 2개 이상이면 -1 반환
if len(most_common) >= 2:
return -1
return most_common[0]
Counter 객체를 생성하여 각 요소가 몇 번 등장했는지 계산합니다.
그 다음, 가장 많이 등장한 횟수를 따로 기록해둡니다.
이후 most_common 리스트에 가장 많이 등장한 숫자들을 전부 포함시킵니다.
만약 리스트의 길이가 2 이상이라면, 최빈값이 2개 이상이므로 -1을 반환합니다.
길이가 1이라면, 해당 리스트의 첫번째 요소(인덱스 0)을 반환합니다.
다른 사람의 풀이 중 패키지 없이 푼 풀이가 있습니다.
def solution(array):
while len(array) != 0:
for i, a in enumerate(set(array)):
array.remove(a)
if i == 0: return a
return -1
이건 array에서 모든 값이 삭제될 때까지 반복하는 코드입니다.
먼저 array의 집합으로 중복을 모두 제거한 뒤, 인덱스와 값을 동시에 추출합니다.
그 다음, array에서 해당 값이 첫번째로 나타나는 곳을 삭제합니다. 그러면 array에는 해당 값 하나가 삭제됩니다.
이걸 계속 반복하다보면 최빈값만 남게 됩니다. 따라서 i가 0이라면, a를 반환하면 됩니다.
i가 0이 아니라면 최빈값이 둘 이상이라는 뜻이므로 -1을 반환합니다.
최빈값의 특성을 활용한 멋진 풀이였습니다.
'코딩테스트 입문' 카테고리의 다른 글
피자 나눠 먹기 (1) (0) | 2024.07.08 |
---|---|
짝수는 싫어요 (0) | 2024.07.07 |
중앙값 구하기 (0) | 2024.07.05 |
나머지 구하기 (0) | 2024.07.04 |
배열 두 배 만들기 (0) | 2024.07.03 |