CS 지식/Algorithm-Problem Solving 정리

백준 온라인 저지 2108 문제풀이 with Python3

Hoplin 2020. 1. 2. 19:38
반응형

BOJ(백준 온라인저지) 2108번 통계학 코드 및 해설


  • 백준 온라인 저지 2108번 문제 풀이

  • 문제와 주어진 예시들

    img

    )

    img

  • Code

    img

  • 풀이순서

    1. 우선 문제를 보면 첫번째 입력값에는 총 입력 수의 개수를 적는것이라고 되어있다. 그 후의 입력값들은 입력개수만큼 수를 입력해 주어야 한다고 한다. 우선 우리가 값을 받기 위해서는 input도 있지만 이 input 함수는 꽤 느린 속도를 가지고 있는 함수이다. 그렇게 때문에 빠른 받기가 가능한 sys모듈의 readline를 사용해 주었다.

       import sys
      
       s = sys.stdin.readline
      
       io = int(s())
    2. 우선 출력해야하는 결과값들을 살펴보자.

      • 첫번째로는 산술평균이며, 소수점 이하 첫째자리에서 반올림한 값을 출력해야한다. 우선 평균을 구하기 위해서는 총 합이 필요하다. 이 총합은 숫자를 입력해주면서 같이 총합값을 구할 수 있다(total_sum). 그리고 첫번째 입력값은 숫자의 개수를 저장한 변수(total_count)로 나누어주면 된다.

      • 두번째로는 중앙값 출력이다. 이는 값들을 입력받은 리스트를 오름차순 정렬을 해준다음 (전체개수) / 2 를 int함수를 이용해 정수값을 구하고 해당 인덱스 번호를 출력해주면 된다.

      • 세번째로는 최빈값을 출력해야한다. 최빈값이 다수인 경우에는 두번째로 작은 값을 출력해야한다. 만약 값을 모두 받고 또 거기서 다시 각각의 인자들의 개수를 세주게 된다면 for문이 두개가 되어서 시간 효율성에서 매우 떨어지게 된다. 그렇기 때문에 숫자값을 받으면서 각각의 인자들의 개수를 세어주면 조금더 효율적이다.

      • 네번째로는 N개의 수들 중 최대값과 최소값의 차이를 출력해주면 된다. 이는 입력 숫자들을 리스트로 받은 다음 max() min()함수를 이용해서 구해줄 수 있다.

3. 직접 코드로 옮겨보자.

    - 우선 우리는 처음에 입력할 숫자의 개수를 입력하고 해당 입력값만큼 숫자데이터를 넣어주어야한다. 이 숫자 데이터를 받으면서 우리는 두가지의 일을 해주어야 한다.

        - 입력된 전체 데이터의 합

        - 각 인자들마다의 입력된 개수

    - 우선 이 두개를 코드로 옮기면 다음과 같다.
s=sys.stdin.readline #입력할 숫자의 개수입력하기
total_count = int(s())

values = [] #입력된 값들을 저장하는 인덱스
data = dict() # 입력된 인자들 각각의 개수를 세어주는 딕셔너리 (key - 인자, values - 입력된 횟수)
total_sum = 0

# 값받기
for a in range(0, total_count):
    val = int(s())
    total_sum += val
    values.append(val)
    if val in data.keys():
        data[val] += 1
    else:
        data[val] = 1
    - 그 후 입력데이터 리스트를 정렬 후 중앙값과 위의 for문에서 받은 총합을 통해서 산술 평균을 출력해줄 수 있다.
# 중복요소 제거
set_total_count = list(set(values))
# 정렬
sort_values = sorted(values)

data_key = list(data.keys())
data_values = list(data.values())  
#산술평균
print(round(total_sum / total_count))

#중앙값
print(sort_values[int(total_count / 2)])
    - 그 다음 최빈값을 구해야 한다. 우리가 앞에서 딕셔너리를 통해서 각각의 인자들의 개수를 딕셔너리로 만들었었다. 여기서 중요한건 key값에 들어가는건 인자이고, values에 들어가는 것은 해당 인자의 입력 횟수이다. 이걸로 알 수 있는것은, 딕셔너리 메소드들중 values()를 이용해면 해당 딕셔너리의 values를 리스트로 반환시킬수 있는데, 이를 통해 가장 많이 등장한 횟수를 구할 수 있다는 것이다. 그리고 딕셔너리에서 (딕셔너리 이름)[ key값 ] 을 통해서 비교를 해주면 된다.
appear_count = sorted(data.values())
result_val = []
for d in range(len(data_key)):
    if data[data_key[d]] == appear_count[-1]:
        result_val.append(data_key[d])
if len(result_val) == 1:
    print(result_val[0])
if len(result_val) > 1:
    result_val.sort()
    print(result_val[1])
  • 범위는 최대값 - 최소값이므로 생략.
반응형