문제
최빈값 구하기
최빈값 구하기
시도
- 최빈값을 구하기 위해 입력되는 리스트를 for문으로 돌려서 dic 딕셔너리에 나오는 횟수를 value값으로 카운트 해준다.
- for문으로 돌린 arr값들이 dic에 존재하지 않을때 value 기본값을 1로 설정하고 arr값이 이미 존재하는 경우 value값을 +1해준다.
- dic에서 최빈값을 가지는 숫자를 가져온다.
- for문으로 다시 돌려서 값을 따져보려 했지만 코드가 길어지고 연산과정도 늘어나기 때문에 다른방법 고민
- max값을 찾아서 해보려 했지만 value값이 동일한 경우 하나만 출력이 돼서 실패..
- (해결)value값에 따라 dic를 내림차순으로 정렬하고 최빈값을 가지는 숫자를 가져온다. 이때 동일한 값을 가지는 숫자가 있는경우를 if문으로 판별한다(해결)
해결
def solution(array):
answer = ''
dic = {}
for arr in array:
if arr in dic:
dic[arr] += 1
else:
dic[arr] = 1
sorted_dic = sorted(dic.items(), key=lambda item: item[1], reverse=True)
if len(sorted_dic) > 1:
if sorted_dic[0][1] == sorted_dic[1][1]:
answer = -1
else:
answer = sorted_dic[0][0]
else:
answer = array
return answer
- 9번째 행: value값을 기준 내림차순으로 key값을 정렬
sorted_dic = sorted(dic.items(), key=lambda item: item[1], reverse=True)
-> sorted_dic = 정렬해라(딕셔너리의 key:value쌍을, key=lambda 가져오는 쌍의 key값 : value값, 내림차순으로)
- 10행 이후 if문: 정렬한 sorted_dic의 개수가 2개 이상일때
첫번째와 두번째 숫자의 최빈값이 같은경우 문제에서 요구하는 -1값을 출력하고
값이 다른경우 최빈값이 가장 높은 첫번째의 숫자를 출력해라
- 15행 else문: 1개의 array가 입력이 된 경우 그 값이 그대로 최빈값을 가지기 때문에 그대로 array를 출력한다.
알게된점
- 다른사람의 풀이를 통해 여러 접근방식을 알 수 있었다.
- 해당 코드는 다른분의 답안코드이다.
def solution(array):
while len(array) != 0:
for i, a in enumerate(set(array)):
array.remove(a)
if i == 0: return a
return -1
- 이해하기 위해 중간중간 print함수를 사용하여 구조를 분석해보니 while안의 for문이 돌아갈때는 다음과 같다.
- 4행과 5행의 사이에 print(i, array)를 출력해보면 다음과 같다.
0 [2, 2, 3, 3, 3, 4, 4, 4, 4]
1 [2, 3, 3, 3, 4, 4, 4, 4]
2 [2, 3, 3, 4, 4, 4, 4]
3 [2, 3, 3, 4, 4, 4]
>1번째 실행
0 [3, 3, 4, 4, 4]
1 [3, 4, 4, 4]
2 [3, 4, 4]
>while문에 의해 2번째 실행
0 [4, 4]
1 [4]
>while문에 의해 3번째 실행
0 []
4
>while문에 의해 4번째 실행, i가 0이기 때문에 남아있는 요소 a return결과값
- 첫번째 i가 0일때 set(array)가 {1,2,3,4}로 한바퀴를 돌면서 해당 숫자들을 하나씩 제거하게 된다. 다음 반복진행시 array에서 1이 존재하지 않기때문에 set(array)가 {2,3,4}인채로 다시 for문을 돌게 된다.
- 반복해서 진행을 하게 되면 while문이 계속 돌았을때 순번이 계속 줄어들게 되고 i가 0 즉 array의 요소가 하나가 남았을때 그 결과를 return하게 한다.
처음에 보고 와 진짜 신박하다 생각이 들었고 이해하는데 많은 시간을 들였다.. 저렇게 돌려볼 생각조차 나지않아서 처음엔 소름도 돋았다..
처음 코드의 동작을 이해하려고 출력문을 작성했는데 오히려 그 부분에서 배열의 정렬여부에 집착하면서 헷갈리게 됐던 것 같다. 항상 방심하면 안될 것 같다..