본문 바로가기

백준 write-up/정렬 & 그리디

[백준] 점수 계산 : 2822번 - Python

728x90
반응형

 

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

 

2822번: 점수 계산

8개 줄에 걸쳐서 각 문제에 대한 참가자의 점수가 주어진다. 점수는 0보다 크거나 같고, 150보다 작거나 같다. 모든 문제에 대한 점수는 서로 다르다. 입력으로 주어지는 순서대로 1번 문제, 2번 문

www.acmicpc.net

 

 

 

문제를 풀면서 몰랐던 개념

 

 [Python] enumerate 함수

-> 리스트가 있는 경우 순서와 리스트의 값을 전달하는 기능을 한다. 

for i, name in enumerate(['body', 'foo', 'bar']):
	print(i, name)

# 출력 결과
0 body
1 foo
2 bar

0번째부터 출력되기 때문에 1번째부터 출력을 원하면 i+1을 해주면 된다!

 

 

 

문제의 접근 방법

 

- 참가자의 점수 8개 입력 받기

- 입력으로 주어지는 순서대로 번호 매기기

- 참가자의 점수 정렬해서 큰 순서대로 5개의 값 더하기

- 출력된 5개의 점수들의 번호를 정렬하기

 

 

 

내가 막혔던 부분

 

(1) 입력 받는 점수들에 대해 어떻게 번호를 부여해야 하는지 알지 못했음.

(2) 번호와 점수들을 각각 다른 리스트에 넣어서 정렬하려고 함.

(3) list comprehension 으로 구현하는 데 어려움을 겪었음.

 

 

 

문제 풀이 방법

 

반복문을 통해 총 8개의 점수들을 입력 받는다 -> 입력 받은 점수들을 arr 리스트에 추가한다 -> enumerate 함수를 사용해서 arr2 리스트에 2차원 배열로 번호와 점수를 짝지어서 추가한다(정렬을 위해 점수와 인덱스 순서를 반대로 추가함) -> arr2 리스트를 내림차순으로 정렬한다 -> 반복문을 사용해서 arr2 안에 있는 요소들 중 [i][0]번째 값(점수)을 5번 추출해서 더해주고, [i][1]번째 값들(번호)은 arr3 리스트에 추가해준다. -> arr3를 오름차순으로 정렬한다 -> 출력 형식에 맞게 합산한 값과 정렬된 번호들을 출력.

 

 

 

 

소스코드

arr = []
arr2 = []
arr3 = []
sum = 0

for i in range(8):
    s = int(input())
    if (0<=s<=150):
        arr.append(s)

for i, score in enumerate(arr):
    arr2.append([])
    arr2[i].append(score)
    arr2[i].append(i+1)

arr2 = sorted(arr2, reverse=True)

for i in range(5):
    sum += arr2[i][0]
    a = arr2[i][1]
    arr3.append(a)

arr3 = sorted(arr3)

print(sum)

for i in arr3:
    print(i, end=' ')
728x90
반응형