파이썬/코딩 테스트

[Do-it! 코딩 테스트-기초편] 002. 평균 구하기

caramel-bottle 2023. 10. 22.

문제

https://www.acmicpc.net/problem/1546

 

1546번: 평균

첫째 줄에 시험 본 과목의 개수 N이 주어진다. 이 값은 1000보다 작거나 같다. 둘째 줄에 세준이의 현재 성적이 주어진다. 이 값은 100보다 작거나 같은 음이 아닌 정수이고, 적어도 하나의 값은 0보

www.acmicpc.net


접근

데이터 크기: 1,000 * 100 = 100,000

시간 제한: 2초

메모리 제한 128MB

 

과목의 개수를 입력하고, 개수만큼 점수를 한 줄에 입력한다.

 

파이썬으로 임의의 개수의 정수를 한 줄에 입력받기

-> map() 함수를 사용, list() 사용

 

list의 최대값을 구한다.

새로운 리스트에 새로 연산한 점수들 저장한다.

 

새로운 리스트의 평균을 구한다.


코드

N = int(input())
new_score = [0]*N

scores = list(map(int, input().split(' ')))  # O(N)

max_score = max(scores)

for i in range(N):  # O(N)
    new_score[i] = (scores[i] / max_score) * 100

avg = sum(new_score) / N    # O(N)
print(avg)

설명

N을 입력받는다.

새로운 값을 받기 위한 리스트를 크기가 N인 빈 리스트로 초기화한다.

공백으로 구분된 한 줄의 입력을 int형 리스트로 저장하고, max()함수를 사용하여 최대값을 구해 따로 저장한다.

반복문을 통해 새로운 리스트에 연산한 값을 넣는다.

리스트 총합으로 평균을 구해 출력한다.


피드백

책의 해답을 보니 새로운 리스트를 만들 필요가 없다는 사실을 알게 되었다.

 

새로운 리스트의 역할은 연산 후 각각의 점수를 알 수 있는 것 뿐 평균을 구하기 위해선 필요가 없다.

 

내 생각:

(수정 리스트) = (기존 리스트) / max(기존 리스트) * 100

sum(수정 리스트) / max(기존 리스트) * 100

 

책의 생각:

sum(기존 리스트) / max(기존 리스트) * 100

 

코드가 간결해지긴 하지만 시간복잡도는 같다.

하지만 수학적으로 더 간결한 연산이 가능한 경우 시간복잡도를 줄일 수 있는 경우가 있을 것 같다.

 

기존 반복문

for i in range(N):  # O(N)
    new_score[i] = (scores[i] / max_score) * 100

리스트 컴프리헨션

N = int(input())

scores = list(map(int, input().split(' ')))  # O(N)

max_score = max(scores)

new_score = [score/max_score * 100 for score in scores]  # O(N)

avg = sum(new_score) / N    # O(N)
print(avg)

리스트 컴프리헨션을 사용하면 new_score를 초기화할 필요도 없고 더 간결하게 코드를 작성할 수 있다.


알고리즘

2023.10.21 - [파이썬/알고리즘] - [알고리즘] 자료구조, 배열과 리스트

 

[알고리즘] 자료구조, 배열과 리스트

기본 자료구조로서의 배열과 리스트에 대해 알아본다. 배열 배열은 메모리 공간에 연속적으로 존재한다. 각 인덱스는 연속된 메모리 주소를 갖는다. 인덱스로 값에 접근할 수 있다. 특정 인덱스

caramelbottle.tistory.com

 

댓글