Basic Data Types - Nested Lists

Nested Lists라고 하는 리스트 심화 문제를 풀어보자.

문제 풀이

문제 해석

N명의 학생으로 이루어진 학급에서, 각 학생의 이름과 점수가 주어진다. 중첩 리스트의 형태로 저장한 후 출력할 것

Input Format

  • 첫번째 줄은 학생의 수를 나타내는 정수 N이 입력된다.
  • 이어 입력되는 2N개의 줄은 학생의 이름과 그 학생의 점수를 각각 한 줄로 하여 N번 입력된다.

Output Format

  • 두 번째로 낮은 점수를 가진 학생(들)의 이름을 출력할 것. (두 명 이상일 경우 개행하며 알파벳 순서로 출력)

문제 풀이

중첩 리스트의 형태로 저장하라고 해서 괜히 더 헷갈렸는데, 점수를 key로, 이름이 담긴 list를 value로 하는 dictonary 하나와, 점수의 리스트를 만든 후 sorting만 잘 하면 되는 문제였다.

이미 주어진 코드 해석

1
2
3
4
if __name__ == '__main__':
for _ in range(int(input())):
name = input()
score = float(input())
  • 각 입력 줄을 받아 N번의 for문을 돌리며 name과 score라는 변수에 할당해주는 것은 친절한 해커랭크가 해주었으니 for문 안팎으로 작업하고 출력해주면 된다.

Pseudocoding

  • 먼저 for문 밖에서 전체 데이터를 담을 빈 딕셔너리와 점수데이터를 담을 빈 리스트를 하나씩 만들어준다.
  • 딕셔너리의 key로 score을, value로 이름이 담긴 리스트를 넣어준다. 이 때 if문으로 같은 점수를 가진 경우에 대해 작업을 따로 해준다.
    • 딕셔너리에 처음 입력되는 score인 경우 이름을 list에 담아 저장해준다. 그리고 점수는 list에 append해준다.
    • 이미 해당 score가 있으면, 해당 value에 있는 list에 이름을 append 해주고, 이미 score가 있는 list에는 점수가 있을테니 별도로 append하지 않는다.
  • score가 담긴 리스트를 오름차순으로 정렬해준 후, 두번째로 작은 값, 즉 인덱스가 1인 값을 키로하는 리스트를 데려와 정렬 후 출력한다.

코드 작성하기

1
2
3
4
5
6
7
8
9
10
11
12
13
if __name__ == '__main__':
records = {}
scores = []
for _ in range(int(input())):
name = input()
score = float(input())
if records.setdefault(score, False):
records[score].append(name)
else:
records[score] = [name]
scores.append(score)
result = sorted(records[sorted(scores)[1]])
print(*result, sep='\n')

느낀 점

  • 아직 지저분해보이지만 나의 최선을 다했다… 더 좋은 방법은 없는 것인가.