Baekjoon 2108번 통계학

노그리·2022년 4월 30일
0

📑 Algorithm

목록 보기
5/15

💭 문제가 궁금하다면?

내가 시도한 방법

🔺 풀면서 아쉬웠던 부분

1. Time Limit Exceeded

  • input으로 입력을 받으니까 채점 게이지도 움직이지 않고 시간초과가 났다...
  • sys.stdin.readline()이 필수인 문제였다.

2. 최빈값이 여러 개일 때,

  • 문제를 제대로 안읽어서 최빈값이 여러 개 일 때, 두 번째로 작은 값을 출력하라는 조건을 처리하지 않았었다.
  • 그 부분을 처리하기 위해서 새로운 배열 cnt_index를 만들었는데....
  • cnt_index의 길이는numbers의 구별되는 요소(중복을 제거한)의 수이기 때문에 채점을 하고 난 후 메모리 사용량이 확실히 다른 사람들보다 컸다.

3. 카운트 배열을 사용했다면...?

  • 나올 수 있는 숫자의 범위가 -4000~4000까지 였는데......그 부분을 놓쳐서 카운트 배열을 사용하지 못하는 줄 알았다. 음수가 섞여있어서 안되겠다 싶었는데....범위가 있었으면 일정 값을 더해서 양수화한 다음에 풀었을 수도 있을 거 같은데.........으흠...카운트 배열을 사용했더라면 조금 더 수월하게 풀었을 것만 같은 느낌이 들지만 아직 시도해보지 않았으니........후에 카운트 배열로 다시 한번 풀어보고 후기를 추가하겠다..ㅜㅜ

🔴 Pass한 코드

  • ans1입력값을 리스트화 시키면서 구했다.
  • ans2, ans4numbers배열을 정렬시킨 다음 인덱스로 접근하여 구했다.
  • 최빈값인 ans3mode()라는 함수를 만들어서 처리했다.
    정렬 후라는 점(중복 숫자들이 연달아 나온다는 특징)을 이용해서, 숫자의 갯수를 카운트하고, 해당 숫자의 갯수와 위치를 배열에 기록해서 풀었다.
def mode(numbers):
    maxC = cnt = 0                      # maxC: cnt 최댓값 / cnt: 출연 횟수(같은 숫자가 한 번 나올때부터 cnt가 +1 됨)
    i = 0                               # i: numbers 인덱스(기준 숫자를 가리킴)
    j = i+1                             # j: numbers 인덱스(비교 숫자를 가리킴)
    cnt_index = []                      # (해당 숫자 출연 횟수, 해당 숫자의 인덱스) 요소가 담긴 배열
    numbers += [numbers[0]]             # numbers의 마지막 숫자까지 순회하기 위해 더미 요소 추가하기

    while i < N and j <= N:
        if numbers[i] == numbers[j]:    # 기준(numbers[i])와 비교대상(numbers[j])이 같으면,
            j += 1                      # 다른 비교대상으로 교체
            cnt += 1                    # 기준 숫자의 출연 횟수 +1
        else:
            cnt_index.append((cnt, i))  # 다르면,
            i = j                       # 비교대상의 위치로 기준 숫자를 갱신
            j = i+1                     # 기준이 바뀌었기 때문에, 그에 따라 비교대상도 갱신
            maxC = max(maxC, cnt)       # 지금까지 구한 cnt가 maxC보다 크면 갱신
            cnt = 0                     # cnt 초기화

    cnt_index = list(filter(lambda x: x if x[0] == maxC else False, cnt_index))

    if not cnt_index:
        return numbers[0]
    elif cnt_index[0] == cnt_index[-1]:
        return numbers[cnt_index[0][1]]
    else:
        return numbers[cnt_index[1][1]]


import sys
N = int(input())
numbers = []
total = 0

for _ in range(N):
    number = int(sys.stdin.readline().rstrip())
    total += number
    numbers.append(number)

numbers.sort()
ans1 = round(total/N)                   # 산술평균
ans2 = numbers[N//2]                    # 중앙값
ans4 = abs(numbers[-1]-numbers[0])      # 범위
ans3 = mode(numbers)                    # 최빈값

print(ans1)
print(ans2)
print(ans3)
print(ans4)

profile
자기소개가 싫어요

0개의 댓글