[ 알고리즘 ]/오답노트

[ BOJ 오답노트 ] 2108 파이썬 : 통계학

불주먹고양이 2022. 2. 19. 12:34

2022 02 19

 

1. 틀린 기록

 

 

 

2. 원인 분석

- 시간 초과 판정이 났다. 한 2%까지 채점되다가 시간초과가 딱 떠버린게 네번이다. ㅎㅎ

- 문제 풀이 중에서 최빈값 (가장 많이 나온 값)을 찾는 부분에서 'count' 함수를 사용한 것이 시간초과의 원인이었다.

 

- count 함수는 O(N)의 복잡도를 가지지만, 내가 짠 코드에서는 while 문 안에서 계속 선형 탐색하면서 연산하기 때문에 O(N^2)까지 연산량이 증가한 것으로 보인다. 

- 그래도 내 나름대로 i += count를 해주어서 그 다음 값이 현재 값과 같다면 굳이 확인하지 않아도 되게 설계했지만, 어차피 count 함수는 연산 중에 인덱스 0부터 끝까지 연산하기 때문에 의미가 없었던 것이다.

 

 

 

3. 해결

import sys
input = sys.stdin.readline

n = int(input())
lst = []

for _ in range(n):
    lst.append(int(input()))

countLst = []
lst.sort()

# 산술평균
print(round(sum(lst) / n))


# 중앙값
print(lst[n//2])


# 최빈값
i = 0
while i < n:
    count = 1
    val = lst[i]

    for j in range(i+1, n, 1):
        if val == lst[j]:
            count += 1
        else:
            break
    i += count
    countLst.append([val, count])


countLst.sort(key=lambda x: (-x[1], x[0]))

if n == 1:
    print(countLst[0][0])
elif countLst[0][1] == countLst[1][1]:
    print(countLst[1][0])
else:
    print(countLst[0][0])

# 범위
print(max(lst) - min(lst))

 

 

 

4. 배운 점

- count 함수가 가장 효과적일 것이라고 생각했지만, 어차피 처음부터 끝까지 반복하면서 개수를 센다는 것을 간과하고 있었던 것 같다.

- 이번 문제에서 하도 lambda를 많이 써서 이제 문법을 확실히 익히는 계기가 되었다.