문제
https://www.acmicpc.net/problem/1546
접근
데이터 크기: 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 - [파이썬/알고리즘] - [알고리즘] 자료구조, 배열과 리스트
'파이썬 > 코딩 테스트' 카테고리의 다른 글
[Do-it! 코딩 테스트-기초편] 007. 주몽의 명령 (1) | 2023.10.25 |
---|---|
[Do-it! 코딩 테스트-기초편] 006. 연속된 자연수의 합 구하기 (0) | 2023.10.24 |
[Do-it! 코딩 테스트-기초편] 004. 구간 합 구하기 2 (0) | 2023.10.23 |
[Do-it! 코딩 테스트-기초편] 003. 구간 합 구하기 1 (2) | 2023.10.23 |
[Do-it! 코딩 테스트-기초편] 001. 숫자의 합 구하기 (2) | 2023.10.22 |
댓글