티스토리 뷰

백준

백준 2108 문제풀이 [python]

ys.k 2023. 8. 7. 00:43

포스팅에 앞서 내용이 틀릴 수 있습니다.
해당 부분 지적 감사히 받습니다.

문제를 보자.

솔직히 생각했던 거보다, 시간도 오래 걸렸고 고전했던 문제다.

 

그 흔적이다.

 

코드부터 보자.

 

코드

import sys as s
import math
n = int(s.stdin.readline())
array = {}
array1 = []
for i in range(n):
    a = int(s.stdin.readline())
    if a in array:
        array[a] += 1
    else:
        array[a] = 1
    array1.append(a)

array2 = sorted(array, key = lambda x:x)

print(round(sum(array1)/n))                                             # 1번째

array1 = sorted(array1)
print(array1[n//2])                                                             # 2번째

array1 = sorted(array, key = lambda x:(-array[x],x))

if len(array) == 1:
    print(array1[0])
elif len(array) > 1 :
    if array[array1[0]] == array[array1[1]] :
        print(array1[1])
    else:
        print(array1[0])
else:
    print(array1[0])                                                             # 3번째
   
print(max(array2)-min(array2))                                        # 4번째

참 길다.

 

문제가 된 부분은 3번째 문제이다.

 

빈도수가 겹치면 2번째로 작은 값을 출력해주어야 한다.

 

이 부분에서 배열의 인덱스 값, 키 접근 방식에 대해 여러 가지 잘못된 시도들을 했다.

 

결과적으로 코드와 시간이 복잡하고 오래 걸리게 되었다.

 

해당 부분을 좀 더 간단하게 해결하는 방법은 파이썬 내장함수인 counter 모듈을 사용하는 방법이 있다.

 

또한 counter를 사용했을 경우 코드 단축도 가능하다.

 

코드

import sys as s
import math
from collections import Counter
n = int(s.stdin.readline())
array = {}
array1 = []
for i in range(n):
    a = int(s.stdin.readline())
    if a in array:
        array[a] += 1
    else:
        array[a] = 1
    array1.append(a)

array2 = sorted(array, key = lambda x:x)

print(round(sum(array1)/n))

array1 = sorted(array1)
print(array1[n//2])

array1 = Counter(array1).most_common()

if len(array1) > 1 and array1[0][1] == array1[1][1]:
    print(array1[1][0])
else:
    print(array1[0][0])
   
print(max(array2)-min(array2))

6줄 줄였다.

 

위 두 방법으로 모두 문제를 풀 수 있다.

하지만 근소한 차이를 보였는데, Counter를 사용했을 때, 시간과 메모리를 조금 더 사용하는 모습을 볼 수 있다.

 

해당 방법은 다음 블로그를 참고하였다.

출처 : https://jiwon-coding.tistory.com/8

 

[백준] 2108번 통계학 파이썬(python)

# 문제 링크 www.acmicpc.net/problem/2108 2108번: 통계학 첫째 줄에 수의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 그 다음 N개의 줄에는 정수들이 주어진다. 입력되는 정수의 절댓값은 4,000을 넘지 않는다. www.a

jiwon-coding.tistory.com

배운 점

1. from collections import Counter // 를 통해 Counter를 사용할 수 있다. 

2. array1 = Counter(array1). most_common() // 로 빈도수를 key = lambda x:(빈도수, 수의 오름차순)과 같은 결과를 반환받아 볼 수 있다.

 

'백준' 카테고리의 다른 글

백준 4134 문제풀이 [python]  (0) 2023.08.08
백준 골드 티어 달성  (0) 2023.08.07
백준 20920 문제풀이 [python]  (0) 2023.08.06
백준 25192 문제풀이 [python]  (0) 2023.08.05
백준 13909 문제풀이 [python]  (0) 2023.08.03
댓글