난이도: ●○○ | 풀이 시간: 20분 | 시간 제한: 1초 | 메모리 제한: 128MB | 기출: D 기업 프로그래밍 콘테스트 예선

문제: N명의 학생 정보가 있다. 학생 정보는 학생의 이름과 학생의 성적으로 구분된다. 각 학생의 이름과 성적 정보가 주어졌을 때 성적이 낮은 순서대로 학생의 이름을 출력하는 프로그램을 작성하시오.

입력 조건:
– 첫 번째 줄에 학생의 수 N이 입력된다. (1 ≦ N ≦ 500)
– 두 번째 줄부터 N + 1번째 줄에는 학생의 이름을 나타내는 문자열 A와 학생의 성적을 나타내는 정수 B가 공백으로 구분되어 입력된다. 문자열 A의 길이와 학생의 성적은 100 이하의 자연수이다.
출력 조건:
– 모든 학생의 이름을 성적이 낮은 순서대로 출력한다. 성적이 동일한 학생들의 순서는 자유롭게 출력해도 괜찮다.
입력 예시)
2
홍길동 95
이순신 77
출력 예시)
이순신 홍길동

문제 풀이)

성적이 낮은 순서대로 이름을 출력하는 문제다. 지난번 내림차순 정렬이랑 비슷한데, 이번엔 숫자만 정렬하는 게 아니라 이름이랑 성적을 묶어서 관리해야 한다는 게 포인트다.
입력을 보면 홍길동 95 처럼 이름과 성적이 한 줄에 같이 들어온다. 따로따로 저장하면 나중에 누구 성적이 누구 건지 매칭이 안 되기 때문에, (이름, 성적) 형태로 묶어서 리스트에 넣었다. 한 줄 입력을 쪼갤 때는 split()을 쓰면 공백 기준으로 ['홍길동', '95'] 처럼 나눠진다.
정렬은 sorted()를 쓰는데, 그냥 쓰면 튜플의 첫 번째 값인 이름 기준으로 정렬된다. 성적 기준으로 정렬하려면 key= 옵션으로 기준을 지정해줘야 한다. lambda x: x[1]은 “각 원소에서 두 번째 값을 기준으로 삼겠다”는 뜻이다. 성적이 낮은 순서니까 reverse 옵션은 따로 안 줘도 된다.
마지막으로 정렬된 리스트에서 이름만 꺼내서 출력한다. student[0]이 이름이고, end=' '로 공백 구분해서 한 줄로 이어지게 했다.

n = int(input())
array = []
for i in range(n):
input_data = input().split() # '홍길동 95' → ['홍길동', '95'] 로 쪼개기
name = input_data[0] # 첫 번째가 이름
score = int(input_data[1]) # 두 번째가 성적 (숫자로 변환)
array.append((name, score)) # 튜플 형태로 리스트에 저장
array = sorted(array, key=lambda x: x[1]) # 점수를 기준으로 정렬 (x[1]이 점수)
for student in array:
print(student[0], end=' ') # 학생 이름(student[0])만 출력

이걸 실제로 입력 예시를 입력해보면, 아래와 같다.


이 외에도 다른 풀이를 찾아 보면, 아래와 같다.

익숙해지면 입력, 정렬, 출력 세 단계를 각각 한 줄로 압축할 수 있다고 한다.
입력은 리스트 컴프리헨션으로 n번 반복하면서 split()으로 바로 쪼개서 받는다. 이때 숫자 변환은 여기서 안 하고 정렬할 때 처리한다.
정렬은 sort()로 원본 리스트 자체를 바꾼다. x[1]이 문자열 '95'로 저장돼 있으니까 int()로 변환해서 비교해야 한다. 변환 안 하면 문자열 기준으로 정렬돼서 '9' > '7' 같은 식으로 잘못 비교될 수 있다.
출력은 이름만 뽑은 리스트를 * 언패킹으로 한 번에 공백 구분해서 출력한다.

n = int(input())
array = [input().split() for _ in range(n)]
array.sort(key=lambda x: int(x[1])) # 점수를 기준으로 정렬
print(*[x[0] for x in array]) # 학생 이름만 출력

책에서는 어떻게 답을 했는지 찾아보니 아래와 같았다(그냥 첫 번째 내가 풀었던 거와 거의 비슷하다)

# N을 입력받기
n = int(input())
# N명의 학생 정보를 입력받아 리스트에 저장
array = []
for i in range(n):
input_data = input().split()
# 이름은 문자열 그대로, 점수는 정수형으로 변환하여 저장
array.append((input_data[0], int(input_data[1])))
# 키(Key)를 이용하여, 점수를 기준으로 정렬
array = sorted(array, key=lambda student: student[1])
# 정렬이 수행된 결과를 출력
for student in array:
print(student[0], end=' ')


Discover more from Iridescent Seraphim

Subscribe to get the latest posts sent to your email.

Posted in

Leave a comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.