ps:problems:boj:10814
나이순 정렬
ps | |
---|---|
링크 | acmicpc.net/… |
출처 | BOJ |
문제 번호 | 10814 |
문제명 | 나이순 정렬 |
레벨 | 실버 5 |
분류 |
기초 |
시간복잡도 | O(nlogn) |
인풋사이즈 | n<=100,000 |
사용한 언어 | Python |
제출기록 | 37144KB / 148ms |
최고기록 | 116ms |
해결날짜 | 2021/08/22 |
풀이
- 그냥 시키는대로 정렬해서 출력만 하면 되는 문제.
- 원래는 stable 하게 소팅하는 것도 요구하는 문제이지만, 파이썬의 내장 sort함수는 이미 stable하기 때문에 별로 신경쓸 필요가 없다.
- 입력받은 라인을, 나이와 이름의 튜플로 변환하고, 그것을 소팅해서 출력해도 되지만, 그냥 라인을 문자열 그대로 저장해서 갖고 있으면서 sort의 key로 문자열에서 나이를 추출하는 함수를 넘겨주는 것이, 문자열을 그대로 갖고 있는 상태로 소팅할수 있으므로 좀더 빠르게 출력할수 있다.
- 나이의 범위가 1~200까지밖에 없으므로, 버켓 소트로 처리할수도 있다. 이렇게 하면 O(nlogn)이 아니라 O(n)에 처리할수 있지만, 실제적으로 속도 향상이 크지는 않았다. (내장정렬: 164ms, 버켓 소트: 148ms)
코드
코드 1 - 내장 정렬
"""Solution code for "BOJ 10814. 나이순 정렬".
- Problem link: https://www.acmicpc.net/problem/10814
- Solution link: http://www.teferi.net/ps/problems/boj/10814
"""
import sys
def main():
N = int(sys.stdin.readline())
lines = [sys.stdin.readline() for _ in range(N)]
print(''.join(sorted(lines, key=lambda x: int(x.split()[0]))))
if __name__ == '__main__':
main()
코드 2 - 버켓 정렬
"""Solution code for "BOJ 10814. 나이순 정렬".
- Problem link: https://www.acmicpc.net/problem/10814
- Solution link: http://www.teferi.net/ps/problems/boj/10814
"""
import sys
MAX_AGE = 200
def main():
N = int(sys.stdin.readline())
buckets = [[] for _ in range(MAX_AGE + 1)]
for _ in range(N):
line = sys.stdin.readline()
buckets[int(line.split()[0])].append(line)
print(''.join(''.join(bucket) for bucket in buckets))
if __name__ == '__main__':
main()
ps/problems/boj/10814.txt · 마지막으로 수정됨: 2021/08/23 01:03 저자 teferi
토론