본문 바로가기

Python/code problem

[sw expert academy] 1204. 최빈수 구하기

https://swexpertacademy.com/main/main.do

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

내 처음 계획은 다음과 같았다.

받은 수들을 split으로 쪼개서 map,list를 입혀준다.(arr)

→arr 리스트를 sort로 정렬

→arr 리스트를 세트로 만들어 다른 변수에 저장.(arr_set)

→빈 딕셔너리를 하나 만듦(cnt_dict) **cnt는 count를 임의로 줄인 것

→arr_set에 들어있는 요소들(score) 을 하나씩 cnt_dict의 key로 만들고 value로는 arr의 score count값으로 하자.

→cnt_dict가 모두 채워지면 cnt_dict의 value값들을 모아 최댓값을 구함. 그리고 그걸 max_num에 저장.

→result라는 변수를 하나 만들어주고 초깃값을 0으로 설정

→cnt_dict.items()를 해서 (value,key) 튜플들의 모음을 만들주고 for문을 이용해 각각의 value와 max_num을 비교.

만약 같으면 result 에 (value에 대응되는) key를 저장.그리고 멈춤

→프린트

 

그래서 가장 초반 코드는 다음과 같았다.(오답)

T = int(input())
for t in range(1,T+1):
    N = int(input())
    arr = list(map(int,input().split()))
    arr.sort()
    arr_set = set(arr)
    cnt_dict = {}
    for score in arr_set:
        cnt = arr.count(score)
        cnt_dict[str(score)] = cnt
    max_num = max(cnt_dict.values())
    result = 0
    for key,value in cnt_dict.items():
        if value==max_num:
            result = key
            break
    print('#{} {}'.format(t,result))

결과는 fail이었다.

여기서 문제점은 최빈값이 여러개일 때, 가장 큰 값이 출력되어야 하는데 그러지 않았다는 것이다.

 

그래서 arr.reverse()를 추가해보았다.

T = int(input())
for t in range(1,T+1):
    N = int(input())
    arr = list(map(int,input().split()))
    arr.sort()
    arr.reverse()
    arr_set = set(arr)
    cnt_dict = {}
    for score in arr_set:
        cnt = arr.count(score)
        cnt_dict[str(score)] = cnt
    max_num = max(cnt_dict.values())
    result = 0
    for key,value in cnt_dict.items():
        if value==max_num:
            result = key
            break
    print('#{} {}'.format(t,result))

근데 그래도 fail이다. ㅋㅋ... 뭐가 문제지 생각하다가 새롭게 알게 된 사실이 있었다.

 


1.

set는 중복을 없애줄 뿐만 아니라 정렬도 해준다.(오름차순)

a = [8,9,5,4,3,2,3,3,9]
b = set(a)
print(b)

#{2, 3, 4, 5, 8, 9}

 

2.

set에서 sorted(set,reverse= True)를 해주면 내림차순으로 정렬되어 리스트로 반환된다.

a = {8,9,5,4,3,2,3,3,9}
a = sorted(a,reverse = True)
print(a)

#[9, 8, 5, 4, 3, 2]

 


두개의 답이 나왔다.

 

[1]

  • 60,956 kb메모리
  • 193 ms실행시간
T = int(input())
for t in range(1,T+1):
    N = int(input())
    arr = list(map(int,input().split()))
    arr_set = set(arr)
    arr_setli = sorted(list(arr_set),reverse=True)
    cnt_dict = {}
    for score in arr_setli:
        cnt = arr.count(score)
        cnt_dict[str(score)] = cnt
    max_num = max(cnt_dict.values())
    result = 0
    for key,value in cnt_dict.items():
        if value==max_num:
            result = key
            break
    print('#{} {}'.format(N,result))

 

 

[2]

  • 60,956 kb메모리
  • 197 ms실행시간
T = int(input())
for t in range(1,T+1):
    N = int(input())
    arr = list(map(int,input().split()))
    arr_set = sorted(set(arr),reverse=True)
    cnt_dict = {}
    for score in arr_set:
        cnt = arr.count(score)
        cnt_dict[str(score)] = cnt
    max_num = max(cnt_dict.values())
    result = 0
    for key,value in cnt_dict.items():
        if value==max_num:
            result = key
            break
    print('#{} {}'.format(N,result))

 

리스트로 바꾸고 sort,reverse를 해줬냐 아님 세트 그대로 sort,reverse를 해줬냐 그 차이이다.