본문 바로가기
코딩 깔짝

[Python] 21.07.11 : BOJ 10825 + 빠른 출력

by ballena 2021. 7. 11.

BOJ 10825번(https://www.acmicpc.net/problem/10825)을 풀며.

.

.

.

일단 보자마자 생각한 어려움

1. 문자열(이름), 숫자(점수 3종)를 동시에 입력받아야 한다.

2. 정렬 기준이 4가지다.

 

입력받은 1명의 이름, 점수 3종을 하나의 리스트로 만들고, 전체 리스트는 2차원 리스트가 된다.

[이름, 점수1, 점수2, 점수3]을 입력받을 때, 자료형은 신경쓰지 말고 일단 list()로 받는다.

-> arr = [list(sys.stdin.readline().split()) for _ in range(N)]

 

받은 리스트들을 정렬한다. 각 정렬 기준들의 우선순위와 정렬 기준이 오름차순인지, 내림차순인지 잘 확인해야 한다.

-> arr.sort(key=lambda x: (-int(x[1]), int(x[2]), -int(x[3]), x[0]))

.

.

.

지금까지 빠른 입력 sys.stdin.readline()을 잘 사용했다. 이제는 출력도 빠르게 처리해보자.

print() 대신 sys.stdout.write()이 더 빠르다. 단, 후자는 자동 줄바꿈이 없다.

이번 문제에서의 출력은...

-> for i in arr:

        sys.stdout.write(str(i[0]) + '\n')

i가 arr의 원소를 1차원 형태로 가리킴에 주의한다. i[0] = arr[i][0]이다.

 

그리고 sys.stdin.readline()에서 strip()이나 rstrip()을 사용하니 메모리상에는 차이가 없었지만, 시간은 더 늘어났다.

.

.

.

내 결과보다 메모리/시간이 더 좋게 나온 해답들을 보았다.

아예 입력 단계에서 내림차순으로 정렬시킬 값들은 (100-입력값)으로 입력했다.

sort()는 오름차순이 기본값이고, 100점 만점의 '점수'니 (100-입력값)을 하면 큰 점수는 작은 점수로 기록될 것이다.

출력 시에는 이름만 출력되니 복구할 필요도 없다.

[이름, 점수1, 점수2, 점수3]으로 입력받은 값을 리스트에는 [100-점수1, 점수2, 100-점수3, 이름]으로 삽입한다.

sort()의 기본값은 앞의 요소부터 오름차순으로 비교되니 아예 입력 단계에서 모든 고려사항을 처리한 것이다.

 

단순히 입력값의 자료형만 보는 것이 아니라 성질도 고려해야 한다는 것에 놀랐다.

'코딩 깔짝' 카테고리의 다른 글

[Python] 21.07.11 : BOJ 11652 외  (0) 2021.07.13
[Python] 21.07.10 : BOJ 11576 + join()  (0) 2021.07.10
[Python] 21.07.09 : BOJ 1158  (0) 2021.07.10
[Python] 21.07.08 : BOJ 10989  (0) 2021.07.08
[Python] 21.07.07 : 2차원 리스트의 정렬  (0) 2021.07.07

댓글