[이코테] 5.1 정렬 실전문제

위에서 아래로


import sys

def solution(lst):
    lst.sort(reverse=True)
    answer = ' '.join(lst)
    return answer

if __name__ == "__main__":
    N = int(sys.stdin.readline().rstrip())
    li = list()
    for _ in range(N):
        li.append(sys.stdin.readline().rstrip())
    print(solution(li))

이 문제는 정렬을 할 수 있는지 물어보는 문제이고, input의 개수가 500개 이하이므로 어떠한 알고리즘을 사용해도 구현할 수 있다. 따라서 가장 편한 python 기본 정렬 라이브러리를 이용하는 것이 효과적이다.

성적이 낮은 순서로 학생 출력하기


import sys

def solution(students):
    students.sort(key=lambda x: x[1])
    answer = ''
    for student in students:
        answer += student[0]
        answer += ' '
    return answer

if __name__ == "__main__":
    N = int(sys.stdin.readline().rstrip())
    li = list()
    for _ in range(N):
        name, score = sys.stdin.readline().rstrip().split()
        li.append([name, int(score)])
    print(solution(li))

해당 문제는 input이 10만이다. 따라서 O(NlogN)까지의 알고리즘을 사용하여 구현할 수 있다. 혹은 O(N)인 계수정렬을 사용할 수 있다. 계수정렬을 사용할 수 있는 이유는 성적과 같이 input의 범위가 100이므로 사용하기 적합하다.

하지만 구현의 간단함을 위해 파이썬 기본 라이브러리를 사용하되, lambda 함수와 tuple형태의 자료구조에 익숙함을 갖고 풀 수 있어야 한다.

두 배열의 원소 교체


import sys

def solution(a, b, k):
    a.sort()
    b.sort(reverse=True)
    for i in range(k):
        if a[i] >= b[i]:
            break
        a[i], b[i] = b[i], a[i]
    return sum(a)

if __name__ == "__main__":
    N, K = map(int, sys.stdin.readline().rstrip().split())
    li_a = (list(map(int, sys.stdin.readline().rstrip().split())))
    li_b = (list(map(int, sys.stdin.readline().rstrip().split())))
    print(solution(li_a, li_b, K))

본 문제는 인풋이 10만이므로 마찬가지로 O(NlogN)이하의 알고리즘을 사용해야 하고, 파이썬 기본 라이브러리를 사용하는 것이 효과적이다.