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 |
댓글