728x90
해설 부분은 책에 내용을 포함하고, 더 추가하여 최대한 자세하게 설명하려고 노력했습니다.
문제 설명
N명의 학생 정보가 있다. 학생 정보는 학생의 이름과 학생의 성적으로 구분된다. 각 학생의 이름과 성적 정보가 주어졌을 때 성적이 낮은 순서대로 학생의 이름을 출력하는 프로그램을 작성하시오.
입력 조건
- 첫 번째 줄에 학생의 수 N이 입력된다. (1 <= N <= 100,000)
- 두 번째 줄부터 N + 1 번째 줄에는 학생의 이름을 나타내는 문자열 A와 학생의 성적을 나타내는 정수 B가 공백으로 구분되어 입력된다. 문자열 A의 길이와 학생의 성적은 100 이하의 자연수이다.
출력 조건
- 모든 학생의 이름을 성적이 낮은 순서대로 출력한다. 성적이 동일한 학생들의 순서는 자유롭게 출력해도 괜찮다.
입력 예시
2
홍길동 95
이순신 77
출력 예시
이순신 홍길동
문제 해설
학생의 수가 최대 10만이다. 입력받을 수 있는 학생 수가 최대 10만이고 학생 1명당 데이터가 2개니까 시간 복잡도가 커지는 알고리즘을 사용하면 안 된다. 파이썬 기본 정렬 라이브러리는 O(NlogN)을 보장하기에 사용해도 좋다. 해설을 보면서 같이 살펴보자.
책에서 제시하는 해설 코드는 다음과 같다.
n = int(input())
student = []
for i in range(n):
data = input().split() # 공백으로 분리되는 데이터를 하나의 변수에 저장
student.append((data[0], int(data[1]))) # 하나의 변수에 2개의 데이터를 담았으니 튜플로 구분해서 저장.
student.sort(key = lambda x : x[1]) # 원하는 부분을 기준으로 정렬
for i in student:
print(i[0], end=' ') # 공백을 사이에 두고 출력
파이썬의 장점이 보이는 코드라고 생각한다. data = input().split()은 공백으로 입력되는 데이터를 data라는 변수 하나에 저장한다. 필자가 이전에 배웠던 C언어에선 안 되는 기능이다. 이름과 점수 2개의 데이터를 하나의 변수에 저장하는 것이다.
student.append( (data[0], int(data[1]))) 처럼 튜플로 저장하는 이유도 data변수 하나에 2개의 데이터가 저장되어 있어서다. 튜플을 이용해서 가능한 기능인데 참 파이썬만의 강력한 기능이라고 생각한다.
key= lambda x : x[1] 는 튜플의 2번째 원소인 점수를 기준으로 오름차순 정렬을 하는 것이다.
해설은 이게 전부다. 책의 저자가 필자에겐 굉장히 실력자로 비친다.
728x90
'[Coding Test] > [이코테]' 카테고리의 다른 글
특정 거리의 도시 찾기(p.339) - DFS/BFS(이코테) (2) | 2022.03.28 |
---|---|
두 배열의 원소 교체(p.182) - 정렬(이코테) (0) | 2022.03.26 |
위에서 아래로(p.178) - 정렬(이코테) (0) | 2022.03.26 |
문자열 재정렬(p.322) - 구현(이코테) (0) | 2022.03.20 |
카드 정렬하기(p.363) - 정렬 문제(이코테) (0) | 2022.03.16 |