[알고리즘] 최빈값 구하기

조성현·2022년 12월 3일
1

오늘의 문제

프로그래머스 - lv.0 최빈값 구하기문제 링크



1. 먼저 dictionary를 사용하여 노가다로 풀어보았다.

def solution(array):
    dict_array = {}
    for i in array:
        if i in dict_array:
            dict_array[i] += 1
        else:
            dict_array[i] = 1
    
    max_idx = -1
    max_cnt = 0
    for i in dict_array:
        if dict_array[i] > max_cnt:
            max_cnt = dict_array[i]
            max_idx = i
        elif dict_array[i] == max_cnt:
            max_idx = -1
    
    answer = max_idx
    return answer

2. 다른 사람의 풀이를 보니... 세상에 또 처음 보는 기능으로 문제를 풀어놨다.

def solution(array):
    while len(array) != 0:
        for i, a in enumerate(set(array)):
            array.remove(a)
        if i == 0: return a
    return -1

3. 눈물을 머금고 처음 보는 enumerate에 대해서 알아보았다.

DaleSeo - 파이썬의 enumerate() 내장 함수로 for 루프 돌리기(링크)

enumerate를 공부한 뒤 위 코드를 이해해보았다.
1. array의 길이가 0이 될 때까지 while문을 돌린다.
2. enumerate(set(array)) 값으로 for문을 돌려 array에서 제거한다.
3. enumerate(set(array))에 값이 하나만 남으면 그 값을 return한다.
4. 만약 최빈값이 여러개 나오는 경우 -1을 return한다.

  • 사실 위 내용을 이해하는게 너무 어려웠다.
    (직접 pycharm에서 i 값을 찍어보고서야 이해할 수 있었다.)

4. 파이썬에게 머리가 깨졌다.

def solution(array):
    while len(array) != 0:
        for i, a in enumerate(set(array)):
            array.remove(a)
        if i == 0: return a
    return -1
  • 어떤 매커니즘으로 코드가 동작하는 지는 이해를 했으나...
  • 도대체 if i ==0: return a는 for문 안에 있는 것도 아닌데 어떻게 i, a를 들고나와서 검증을하고 return을 할 수 있는지 이해가 안갔다.
  • 이게 가능하다는건 for문 안에서 선언 된 변수가 전역변수로 활용된다는 소린데...
  • 머리를 싸매고 검증을 진행해보았다.

python의 globals(), local() 함수를 활용하여 단계별로 namespace(파이썬에서 변수를 저장하는 공간)를 샅샅이 뒤져보았다.

  • 결과적으로 def(함수) 내에 선언된 변수만 지역변수로 취급하며, 이외는 모두 전역으로 선언된다는 결론을 내릴 수 있었다.
  • 원인은... 알 수 없었다. (더 성장해서 다시 한번 싸워보는 걸로...)


파이썬은 정말... 알 수 없는 놈이다.


참고문헌

1.파이썬의 enumerate() 내장 함수로 for 루프 돌리기 - DaleSeo

2. python 공식문서 - enumerate

3.Python의 yield 키워드 알아보기 - tech.ssut(suhun han)

4. 변수의 사용 범위 알아보기 - 파이썬 코딩도장

5. 네임스페이스 - 제대로 파이썬

6. [파이썬] 사전(dictionary) 사용법 - DaleSeo

7. 집합 자료형[set()] - 점프 투 파이썬

profile
맛있는 음식과 여행을 좋아하는 당당한 뚱땡이

2개의 댓글

comment-user-thumbnail
2022년 12월 5일

이겨내 버리자구요 ~ 파이썬 자식....!!

1개의 답글