1. 위에서 아래로
문제
하나의 수열에는 다양한 수가 존재한다. 이러한 수는 크기에 상관없이 나열되어 있다. 이 수를 큰 수부터 작은 수의 순서로 정렬해야 한다. 수열을 내림차순으로 정렬하는 프로그램을 만드시오
입력 조건
1. 첫째 줄에 수열에 속해 있는 수의 개수 N이 주어진다. (1<=N<=500)
2. 둘째 줄부터 N+1번째 줄까지 N개의 수가 입력된다. 수의 범위는 1이상 100,000 이하의 자연수이다.
출력 조건
1. 입력으로 주어진 수열이 내림차순으로 정렬된 결과를 공백으로 구분하여 출력한다. 동일한 수의 순서는 자유롭게 출력해도 괜찮다.
내 코드
n = int(input())
list = []
for i in range(n):
list.append(int(input()))
list.sort(reverse=True)
print(list)
해설 어느 정렬 알고리즘을 사용하라는 조건도 없기 때문에 그냥 파이썬 내장 모듈을 사용하였다.
2. 성적이 낮은 순서대로 학생 출력하기
문제
N명의 학생 정보가 있다. 학생 정보는 학생의 이름과 성적으로 구분된다. 성적이 낮은 순서대로 학생의 이름을 출력하는 프로그램을 작성하시오
입력 조건
1. 첫번째 줄에 학생의 수 n이 입력된다.
2. 두 번쨰 줄부터 n+1번째 줄에는 학생의 이름을 나타내는 문자열 A와 학생의 성적을 나타내는 정수 B가 공백으로 구분되엉 ㅣㅂ력된다. 문자열 A의 길이와 학생의 성적은 100 이하의 자연수이다.
출력 조건
1. 모든 학생의 이름을 성적이 낮은 순서대로 출력한다. 성적이 동일한 학생들의 순서는 자유롭게 출력한다.
내 코드
n = int(input())
list=[]
for i in range(n):
inputdata = input().split()
list.append((inputdata[0],int(inputdata[1])))
list=sorted(list,key=lambda student:student[1])
for i in range(len(list)):
print(list[i][0])
해설 키-값 Dictionary 구조를 이용한 정렬 문제입니다. 앞서 본 예제에도 있듯 sorted() 모듈함수를 통해 쉽게 정렬할 수 있습니다.
3.두 배열의 원소 교체
문제
N개의 원소로 구성된 두 배열이 있다. 구성 원소는 모두 자연수이며, 최대 K번의 바꿔치기 연산을 할 수 있다. 배열 A의 모든 원소의 합이 최대가 되도록 하는 것이 최종 목표이다.
입력 조건
1. 첫 번째 줄에 n,k가 공백으로 구분되어 입력된다.
2. 두 번째 줄에 배열 A의 원소들이 공백으로 구분되어 입력된다.
3. 세 번째 줄에 배열 B의 원소들이 공백으로 구분되어 입력된다.
출력 조건
1. 최대 k번의 바꿔치기 연산을 수행하여 만들 수 있는 배열 A의 모든 원소의 합의 최댓값을 출력한다.
내 코드
n,k = map(int,input().split())
a = list(map(int,input().split()))
b = list(map(int,input().split()))
a.sort()
b.sort(reverse=True)
for i in range(k):
if(a[k] < b[k]):
a[k],b[k] = b[k],a[k]
else:
break
print(sum(a))
해설 입력받은 두 배열을 다른 방향으로 정렬해놓고 같은 인덱스를 갖는 원소끼리 비교합니다. 배열 B의 원소가 더 크다면 그 값을 가져오는 방식으로 진행됩니다.
평가 교재의 정렬 알고리즘 관련 문제들의 난이도가 크게 어렵지 않아서 한 장의 포스트로 줄여보았습니다. 실전에서 이렇게 나올리가 없으니 관련 문제를 더 찾아봐야겠네요..
참고
이것이 코딩테스트다 with Python (나동빈 저)