사용자 도구

사이트 도구


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()

토론

댓글을 입력하세요:
W​ N C S᠎ C
 
ps/problems/boj/10814.txt · 마지막으로 수정됨: 2021/08/23 01:03 저자 teferi