programming

해커랭크 Migratory Birds 퀴즈 파이썬 max()와 count()를 한번에 사용한 풀이


by Kitle · 2020. 08. 17.



안녕하세요. 오늘은 해커랭크의 알고리즘 퀴즈 중 Migratory Birds를 풀어보도록 하겠습니다.

퀴즈 요약

You have been asked to help study the population of birds migrating across the continent. Each type of bird you are interested in will be identified by an integer value. Each time a particular kind of bird is spotted, its id number will be added to your array of sightings. You would like to be able to find out which type of bird is most common given a list of sightings. Your task is to print the type number of that bird and if two or more types of birds are equally common, choose the type with the smallest ID number.

대륙을 가로 질러 이동하는 새들의 개체 수를 연구하는 데 도움을 요청했습니다. 연구에 관심 있는 각 유형의 새는 정수 값으로 식별됩니다. 특정 종류의 새가 발견 될 때마다 해당 새의 ID 번호가 목격 목록에 추가됩니다. 목격 목록을 통해 어떤 종류의 새가 가장 흔한 지 알아 내고 싶습니다. 당신의 임무는 그 새의 유형 번호를 출력 하고 두 가지 이상의 유형의 새가 똑같이 흔하다면 가장 작은 ID 번호를 가진 유형을 선택하여 출력하세요.

풀이

#!/bin/python3

import math
import os
import random
import re
import sys

# Complete the migratoryBirds function below.
def migratoryBirds(arr):
set_arr = list(set(arr))
set_arr.sort()
return max(set_arr, key=arr.count)


if __name__ == '__main__':
fptr = open(os.environ['OUTPUT_PATH'], 'w')

arr_count = int(input().strip())

arr = list(map(int, input().rstrip().split()))

result = migratoryBirds(arr)

fptr.write(str(result) + '\n')

fptr.close()


해설 및 솔루션

우선 썩 좋은 풀이가 아닌 것을 알려드립니다. 

우선 주어진 정수 목록 리스트에서 우리가 해야 할일은 가장 흔한 값을 찾는 것입니다. for 문을 돌면서 각 값들이 얼마나 나타나는지 알고 싶다면 파이썬에서는 쉽게 count() 를 통해 가능합니다. 그러나 단점은 1, 2, 3, 1, 2, 5, 6 이렇게 반복되는 경우 똑같은 원소에 대해서 중복 체크가 일어난다는 것입니다.

중복을 제거하는 가장 쉬운 방법은 무엇일까요? set() 를 이용하는 것입니다. set를 이용하여 중복을 제거한다면 값 비교는 단 한번씩만 해주면 됩니다. 이렇게 카운트를 각각 세어주고 그중에 가장 큰 값을 선택하면 가장 흔한 값이 됩니다. 여기서는 이것들을 한번에 처리해보겠습니다. 단순히 max() 의 최대값을 사용하지만, 추가적인 파라메터로 key 값을 줄 수 있습니다. 

max(set_arr, key=arr.count) 로 하면, set_arr 이 가지고 있는 값중 arr.count 를 카운트한 가장 큰 값을 취하게 됩니다. 만약 count 값이 똑같이 중복인 경우는 먼저 나타난 값이 출력됩니다. 예를들어 1, 1, 2, 2 똑같이 나타난다면 퀴즈에서는 1을 출력하라고 되어있습니다. max는 중복값이 있는 경우 먼저 나타난 원소 값을 출력해줍니다. 따라서 정렬이 필요합니다. set는 순서가 없는 자료형입니다. 운 좋게 오름차순 정렬처럼 보일 수 있지만, 상황에 따라서는 에러가 날 수 있습니다. 따라서 set를 list로 바꾸고 sort 를 통하면, 중복값이 나오는 경우 낮은 값이 선택되게 됩니다. 

여기서는 max()를 key로 접근해 보는 방법을 알아간 것이 좋은 퀴즈였던것 같네요. 퀴즈 원본 출처와 풀이는 다음의 링크에서 확인할 수 있겠습니다.

퀴즈 출처 : 해커랭크로 이동해서 보기

풀이 소스 깃허브에서 보기 : 깃허브로 이동