2주차 | 문제 3. 출석부
문제
구름이는 N명의 사람들의 이름과 키 정보를 가지고 있는 출석부를 만들기로 합니다. 출석부의 순서는 이름을 기준으로 사전 순서로 정렬되어 있지만, 이름이 같다면 키가 큰 순서대로 정렬하기로 합니다. 이때, 사람들의 이름과 키가 모두 같은 사람은 없으며, 키는 소수 2번째 자리 까지 알고 있습니다.모든 사람들의 이름과 키가 주어졌을 때, 출석부를 완성하고 k번째 있는 사람의 이름과 키를 공백을 두고 출력하시오.
입력
첫째 줄에 사람의 수 N(1≤N≤10,000)과 찾아야 하는 수 k(1≤k≤N)이 공백을 두고 주어진다. 둘째 줄부터 N줄에 걸쳐서 사람의 정보가 주어진다. 사람의 정보는 이름 s와 키 t가 각각 공백을 두고 주어진다. 이름은 모두 알파벳 소문자이며, 키는 100 이상 200 이하의 실수이다. 실수는 소수 2번째 자리까지만 주어진다.
출력
출석부 상 k번째 사람의 이름과 키를 주어진 값 그대로 출력하시오.
풀이
n,k=map(int,input().split()) # 사람의 수, k번째 사람
info=[] # n명의 사람의 이름과 키를 저장할 리스트
for _ in range(n):
s,t=input().split() # 이름, 키
info.append((s,float(t))) # tuple형으로 이름,키를 저장(문자열로 입력받았으므로 키는 float형으로 변환)
info=sorted(info, key=lambda x: (x[0],x[1])) # 1번째 기준: 문자열, 2번째 기준: 키
print(info[k-1][0],format(info[k-1][1],'.2f')) # 실수인 키는 소수 2번재짜리까지 출력
이 문제의 포인트는 1) tuple을 리스트에 추가하는 것, 2) 2개 이상의 기준에 따라 정렬하는 것, 3) 소수점 아래 2번째 자리까지 출력하는 것 3가지라고 생각된다.
1) tuple을 리스트에 추가하는 것은 tuple 형태 그대로 append() 함수 안에 넣어주면 된다. 이때 input()의 기본값은 문자열이므로 float 형으로 형변환을 해준 뒤 tuple 형태로 리스트에 추가해야 한다.
2) 2개 이상의 기준에 따라 정렬하는 것은 lambda 함수를 사용할 수 있다.
sorted(arr, key = lambda x : (x[0], x[1]))
sorted() 함수에 정렬할 리스트와 정렬 기준을 넘겨주면 된다. 위의 코드는 x[0]을 첫번째 기준으로, x[1]을 두번째 기준으로 삼는 것이다. x[0]을 기준으로 정렬하다보면 동일한 값이 존재하는 경우가 생길 수 있는데, 이런 경우에 x[1]을 기준으로 하여 정렬하는 것이다.
sorted() 함수는 sort() 함수와는 달리 기존 리스트에 영향을 주지 않으며, 정렬한 결과를 반환하므로 결과를 저장할 변수가 있어야 한다.
3) 소수점 아래 2번째 자리까지 출력하는 것은 format() 함수를 사용하였다.
구름에서 제시한 출력 코드는 다음과 같다.
print(f"{res:.2lf}")
# or
print("{0:.2lf}".format(res))
내가 사용한 출력 코드는 다음과 같다.
print(info[k-1][0],format(info[k-1][1],'.2f'))