[이코테] 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)이하의 알고리즘을 사용해야 하고, 파이썬 기본 라이브러리를 사용하는 것이 효과적이다.