코딩테스트/PYTHON

[프로그래머스][PYTHON] Lv. 0 최빈값 구하기

_알파카 2024. 2. 23. 15:28
728x90

문제 설명

https://school.programmers.co.kr/learn/courses/30/lessons/120812#

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

내 풀이

def solution(array):
    answer = 0
    
    # 중복을 없앤 리스트 set_list
    set_list = list(set(array))
    
    # 원소 count 개수를 담을 num_count
    num_count = [0] * len(set_list)
    
    # 중복이 없는 리스트 set_list를 순회하며..
    # set_list의 원소 각각이 본래 list인 array에 몇 번있는지 확인
    # -> 이 값을 num_count 배열에 차례대로 저장
    for i in range(len(set_list)):
        num_count[i] = array.count(set_list[i])
    
    # set_list:  [1, 3, 5, 7]
    # num_count:  [2, 2, 3, 2]
    # num_count 배열에서 최빈값을 가진 값의 인덱스 
    # (위의 예시일 때 값은 2(최빈값이 3이므로, 숫자 3의 인덱스는 2임))
    mode_idx = num_count.index(max(num_count))
    
    # 횟수를 담은 배열에서 최빈값이 1개가 아니면 answer = -1
    if num_count.count(max(num_count)) != 1:
        answer = -1
    
    # 최빈값이 1개이면, set_list에서 최빈값 인덱스에 해당하는 값을 뽑아옴
    else:
        answer = set_list[mode_idx]
    
    return answer

 

과정: 

먼저, 주어진 리스트에서 중복을 없앤 리스트 set_list를 구했다. 최빈값 없이 어떤 원소들로 리스트가 채워졌는지 보기 위해서이다. 

다음으로, 각 원소의 개수를 담을 새로운 배열을 만들었는데, 이 길이는 주어진 리스트에서 중복되지 않은 원소의 개수(len(set_list))로 설정하였다. 

 

이제, 중복을 없앤 리스트 set_list를 순회하면서, 중복되지 않는 개별의 원소가 본래 문제로 주어진 array 안에 몇 번 있는지 숫자를 센다. (array.count(set_list[i]))

 

이는 각 원소의 개수를 담을 num_count 배열내에 동일한 인덱스 위치에 저장을 한다! 

 

모든 개별 원소를 순회한 뒤, num_count 배열에서 최대값을 가진 값의 인덱스를 mode_idx로 저장한다. 

 

최빈값이 1개가 아니면, answer을 -1로 지정하고, (이 때, 판단 방법은... 최빈값을 count 메소드로 몇 번 나왔는지 센다)

최빈값이 1개라면 set_list 리스트의 최빈값 인덱스에 해당하는 값을 뽑아온다. 

 

 

주석 없이 코드만 나타낸 것은 아래와 같다! 

def solution(array):
    answer = 0

    set_list = list(set(array))
    num_count = [0] * len(set_list)
    for i in range(len(set_list)):
        num_count[i] = array.count(set_list[i])
        
    mode_idx = num_count.index(max(num_count))
    if num_count.count(max(num_count)) != 1:
        answer = -1
    else:
        answer = set_list[mode_idx]
    
    return answer

 

 

다른 사람 풀이

def solution(array):
    answer = 0
    # 원소 1개씩
    set_array = set(array)
    
    max_count = 0
    # 각 원소의 개수를 구하고 가장 많은 개수를 가지고 있는
    # 원소를 저장, 같으면 -1
    for i in set_array:
        count = array.count(i)
        if max_count < count:
            max_count = count
            answer = i
        elif max_count == count:
            answer = -1
    return answer

 

: 위의 코드에서는 최빈값을 나타내는 값 max_count를 지정해두고, 

중복이 없는 배열(set_array)를 순회하며, 본래 array에서 각 값이 몇 번 나왔는지 할당한다. 

만약, 최빈값(max_count)과 순회하면서 측정하는 각각의 count 값을 비교했을 때, count가 더 크면 그 값을 새롭게 최빈값에 배정하고, 

만약 최빈값과 똑같은 count 값이 나오면 최빈값이 여러개이므로 answer은 -1로 지정한다! 

 

 

728x90