https://www.acmicpc.net/problem/10814
문제
온라인 저지에 가입한 사람들의 나이와 이름이 가입한 순서대로 주어진다. 이때, 회원들을 나이가 증가하는 순으로, 나이가 같으면 먼저 가입한 사람이 앞에 오는 순서로 정렬하는 프로그램을 작성하시오.
입력
첫째 줄에 온라인 저지 회원의 수 N이 주어진다. (1 ≤ N ≤ 100,000)
둘째 줄부터 N개의 줄에는 각 회원의 나이와 이름이 공백으로 구분되어 주어진다. 나이는 1보다 크거나 같으며, 200보다 작거나 같은 정수이고, 이름은 알파벳 대소문자로 이루어져 있고, 길이가 100보다 작거나 같은 문자열이다. 입력은 가입한 순서로 주어진다.
출력
첫째 줄부터 총 N개의 줄에 걸쳐 온라인 저지 회원을 나이 순, 나이가 같으면 가입한 순으로 한 줄에 한 명씩 나이와 이름을 공백으로 구분해 출력한다.
문제 탐색하기
나이와 이름이 주어지는데, 나이순으로 정렬하는게 1순위, 나이가 같다면 가입순으로 정렬해서 출력해야 한다.
입력 값은 가입한 순서로 받기 때문에 사실상 이름은 신경 안쓰고 나이만 정렬하면 된다.
그래서 [나이, 이름]으로 구성되어 있는 이중배열(파이썬에서는 리스트)를 이용하면 된다
코드 설계하기
1. 입력을 줄 별로 받는다.
2. 공백을 기준으로 각각 age, name이라는 변수에 넣는다.
3. 이중 배열을 만든다.
4. lambda와 sort()의 키 속성으로 나이를 기준으로 정렬한다.
시도 회차 수정사항
- 1회차: sys.stdin.read()는 모든 입력을 한꺼번에 가져오기 때문에 여러번 사용이 불가하는 것을 배움
근데 분명히 공부했을때는 여러 번 사용이 가능했던걸로 기억해서 알고보니까 sys.stdin.readline()였다..ㅎ
덕분에 둘의 차이점을 알게 되었고 난 read()랑 readline() 이렇게 종류가 있다는 것도 이번에 알았다.
- 2회차: read()는 한꺼번에 입력 받기 때문에 마지막에 빈 줄까지 포함할 수도 있기에 split()말고 자동으로 이를 처리해주는 splitlines()로 변경해주었다.
코드
import sys
# splitlines()로 빈 줄 자동으로 처리
input = sys.stdin.read().splitlines()
n = int(input[0])
data = []
for i in range(1, n + 1):
m = input[i].split()
age = int(m[0])
name = m[1]
data.append([age, name])
data.sort(key=lambda x: x[0])
for age, name in data:
print(age, name)
'코테 공부 > BOJ' 카테고리의 다른 글
[백준] 5635번 - 생일 (파이썬) (0) | 2024.09.12 |
---|---|
[백준] 1181번 - 단어 정렬 (파이썬) (1) | 2024.09.11 |
[백준] 2309번 - 일곱 난쟁이 (파이썬) (3) | 2024.09.09 |
[백준] 2667번 - 단지번호붙이기 (파이썬) (0) | 2024.04.04 |
[백준] 1926번 - 그림 (파이썬) (1) | 2024.04.04 |