파이썬으로 푼 백준 알고리즘 2108번 통계학 문제풀이. 풀이 과정은 결코 어렵지 않다. 다만 시간초과가 떠서 원인 파악 및 해결에 좀 시간이 걸렸다. 이 문제에서 배운 건, 앞으로는 input()과 count() 함수 대신 sys.stdin.readline()과 collections 라이브러리의 Counter 클래스를 사용하는 습관을 들이면 좋을 것 같다는 것.
문제
https://www.acmicpc.net/problem/2108
풀이
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | import sys from collections import Counter nBox = [] sum, avg, mid, mod, ran = 0,0,0,0,0 def avgFinder(nBox): sum , avg = 0,0 for i in range(0, len(nBox)): sum += nBox[i] avg = sum/len(nBox) return round(avg) def midFinder(nBox): nBox.sort() mid = nBox[len(nBox)//2] return mid def modFinder(nBox): cntDic = Counter(nBox) cntTpl = cntDic.most_common() # print(cntTpl) if len(nBox) > 1: if cntTpl[0][1] == cntTpl[1][1]: mod = cntTpl[1][0] else: mod = cntTpl[0][0] else: mod = cntTpl[0][0] return mod def ranFinder(nBox): ran = nBox[len(nBox)-1] - nBox[0] return ran n = int(sys.stdin.readline()) for i in range(0, n): inNum = int(sys.stdin.readline()) nBox.append(inNum) print(avgFinder(nBox)) print(midFinder(nBox)) print(modFinder(nBox)) print(ranFinder(nBox)) | cs |
각각 산술평균, 중앙값, 최빈값, 범위를 찾아주는 함수 4개를 만들었다. 각 함수는 리스트를 인자로 받는다.
산술평균은 아주 흔한 예제다. 리스트 각각의 요소를 sum 변수에 더해준다. sum을 리스트 길이로 나눠준다.
중간값도 쉽다. 리스트를 정렬해준다. n, 즉 리스트의 길이는 홀수로 문제에서 가정했다. 따라서 리스트의 길이를 2로 나눈 몫에 1을 더한 수가 중앙값의 위치다. 리스트의 인덱스는 0부터 시작하므로, 리스트의 길이를 2로 나눈 몫이 중앙값의 인덱스다.
최빈값에서 처음에는 count() 함수를 썼었다. input()을 sys.import.readline()으로 바꿔도 시간초과가 떴는데, 알고보니 원인은 count() 함수였다. 해결책으로 collections 함수에서 Counter 클래스를 가져왔다. cntDic이라는 객체를 생성했다. 그리고 most_common() 메소드를 적용하니 [(최빈값:카운트), (2빈값:카운트) ... ] 형식으로 리스트가 생성되었다.
최빈값이 여러 개일 경우, 두번째로 작은 값을 출력하라고 문제가 제시했다. 테스트 해보니 최빈값이 여러 개일 경우, 즉 카운트가 같을 경우 크기가 작은 값부터 보여줬다.
리스트의 요소가 1보다 클 경우에는 첫번째 튜플의 카운트와 두번째 튜플의 카운트를 비교했다. 만약 두 개가 같다면, 최빈값이 두 개, 혹은 그 이상인 것이다. 어차피 두번째로 작은 값을 출력하면 되니, 이 경우는 두번째 튜플의 값을 출력했다. 아니면 그냥 첫번째 튜플만 최빈값인 거니 그 값을 출력했다.
리스트의 요소가 1보다 크지 않은 경우, 사실상 1과 같은 경우에는 어차피 튜플도 하나다. 그냥 0번 튜플의 0번 요소를 출력하도록 했다.
범위는 그냥 리스트의 마지막 요소에서 첫번째 요소를 빼주면 된다.
그리고 n의 값을 입력받고, n의 수만큼 정수를 입력받아 숫자박스에 더해준다. 그리고 생성된 숫자박스를 각각의 함수에 집어넣고 출력해주면 끝.
'DEVELOP > Algorithm' 카테고리의 다른 글
[C] SW Expert Academy 문제풀이 :: 2001번 (0) | 2018.09.08 |
---|---|
[C] SW Expert Academy 문제풀이 :: 2005번 (0) | 2018.09.07 |
[C] SW Expert Academy 문제풀이 :: 1926번 (0) | 2018.09.06 |
[C] SW Expert Academy 문제풀이 :: 2007번 (0) | 2018.09.05 |
[Python] 백준 알고리즘 문제풀이 :: 2775번 (0) | 2018.09.02 |
[C] SW Expert Academy 문제풀이 :: 2068번 (0) | 2018.09.01 |
[C] SW Expert Academy 문제풀이 :: 2070번 (0) | 2018.08.31 |
[C] SW Expert Academy 문제풀이 :: 2072번 (0) | 2018.08.30 |