https://www.acmicpc.net/problem/10814
10814번: 나이순 정렬
온라인 저지에 가입한 사람들의 나이와 이름이 가입한 순서대로 주어진다. 이때, 회원들을 나이가 증가하는 순으로, 나이가 같으면 먼저 가입한 사람이 앞에 오는 순서로 정렬하는 프로그램을
www.acmicpc.net
문제
온라인 저지에 가입한 사람들의 나이와 이름이 가입한 순서대로 주어진다. 이때, 회원들을 나이가 증가하는 순으로, 나이가 같으면 먼저 가입한 사람이 앞에 오는 순서로 정렬하는 프로그램을 작성하시오.
입력
첫째 줄에 온라인 저지 회원의 수 N이 주어진다. (1 ≤ N ≤ 100,000)
둘째 줄부터 N개의 줄에는 각 회원의 나이와 이름이 공백으로 구분되어 주어진다. 나이는 1보다 크거나 같으며, 200보다 작거나 같은 정수이고, 이름은 알파벳 대소문자로 이루어져 있고, 길이가 100보다 작거나 같은 문자열이다. 입력은 가입한 순서로 주어진다.
출력
첫째 줄부터 총 N개의 줄에 걸쳐 온라인 저지 회원을 나이 순, 나이가 같으면 가입한 순으로 한 줄에 한 명씩 나이와 이름을 공백으로 구분해 출력한다.
코드 정답
import sys
input = sys.stdin.readline
n = int(input())
li = []
for _ in range(n):
li.append(list(input().split()))
li.sort(key=lambda x: int(x[0]))
for i in range(n):
print(li[i][0], li[i][1])
풀이
1~2행 : 일반적으로 input 을 사용하게 된다면 시간 초과가 나올 수 있다. 그렇기 때문에 input 과 같으면서도 빠른 sys.stdin.readline 을 사용하기 위해 import sys 란 헤더를 선언해주었고 input 에 sys.stdin.readline 을 대입하여 input 을 sys.stdin.readline 처럼 사용 할 수 있게끔 된다.
import sys
input = sys.stdin.readline
4~5행 : 값을 입력받아 정수형으로 변환 후 변수 n 에 대입해준다. 이후 li 라는 변수를 리스트 형태로 선언해주었다.
n = int(input())
li = []
7~9행 : n 만큼 반복을 하며 값을 입력을 받게 된다. split 을 이용하여 값을 입력을 띄워쓰기 형태로 여러개 입력받을 수 있게끔 만들었으며 입력받은 것들을 리스트 형태로 바꿔 li 변수에 더해주었다. 이후 sort 를 이용하여 정렬을 해주는데 key 조건을 붙여줌으로서 어떻게 정렬이 될 지 정해주었다. 9행을 그대로 풀이를 해보자면 x[0] 즉, 인덱스 기준 첫 번째 값(나이)으로 정렬을 해주게 된다.
for _ in range(n):
li.append(list(input().split()))
li.sort(key=lambda x: int(x[0]))
11~12행 : n 만큼 반복을 해주며 출력을 해주게 된다. i 에는 0부터 n-1 값 까지 순차적으로 들어가게 되며, 리스트의 인덱스에 포함되어 있는 값들이 출력되게 된다.
for i in range(n):
print(li[i][0], li[i][1])
람다(lambda)함수를 사용해보았다. 사실 이전 문제들을 풀고서 다른 사람들은 어떻게 풀었나 확인해보다가 대부분의 사람들이 lambda 라는 것을 사용하기에 이번에 알아보고 활용해보았다.
일반적인 함수가 아닌, 이름 없는 함수라 불리는 람다함수는 def 키워드를 이용해 함수를 만들어내는 것이 아닌 코드에 나와있는 것처럼 lambda 라고 써낸 후 사용하는 방식으로 이루어진다. 장점으로는 코드가 간단해지고 메모리 절약을 할 수 있다고 한다.
나는 함수는 항상 def 를 이용해서 하는 줄만 알았는데 이러한 방법도 있다는걸 알았으니 앞으로는 lambda 를 적극적으로 활용하며 문제를 풀어볼 것 같다.
'BaekJoon > 단계별로 풀어보기' 카테고리의 다른 글
[백준] 재귀 - 10872번 (Python) (0) | 2023.02.20 |
---|---|
[백준] 정렬 - 18870번 (Python) (0) | 2023.02.19 |
[백준] 정렬 - 1181번 (Python) (1) | 2023.02.14 |
[백준] 정렬 - 11651번 (Python) (0) | 2023.02.13 |
[백준] 정렬 - 11650번 (Python) (0) | 2023.02.12 |