Coder/알고리즘

이코테 CHAPTER 06 정렬 실전 문제

실전문제

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

N명의 학생 정보가 있다. 학생 정보는 학생의 이름과 학생의 성적으로 구분된다.

각 학생의 이름과 성적 정보가 주어졌을 때 성적이 낮은 순서대로 학생의 이름을 출력하는 프로그램을 작성하시오.

 

  • 나의 풀이
n = int(input())
name_score = []

for i in range(n):
    name, score = input().split()
    name_score.append([name,int(score)])

name_score = sorted(name_score, key = lambda x: x[1])

for i in range(n):
    print(name_score[i][0], end = ' ')
​

- 처음에 성적인 것 보고 계수 정렬 쓰려고 했다가 안되는 걸 깨닫고 sorted 함수의 옵션을 찾았다.
- lamda함수를 적절히 이용할 수 있어야겠다.

 

  • 답안 예시 코드
n = int(input())

# N명의 학생 정보를 입력받아 리스트에 저장
array = []
for i in range(n):
	input_data = input().split()
	# 이름은 문자열 그대로, 점수는 정수형으로 변환하여 저장
	array.append((input_data[0], int(input_data[1])))

# 키(Key)를 이용하여, 점수를 기준으로 정렬
array = sorted(array, key=lambda student: student[1])

# 정렬이 수행된 결과를 출력
for student in array:
	print(student[0], end=' ')​

- 답안 예시와 나의 코드는 학생 정보를 받은 부분과 결과 print 부분이 다르다.
- print 할 때, array에 있는 리스트를 바로 가져오는 게 더 빠르다.

 

두 배열의 원소 교체

동빈이는 두 개의 배열 A와 B를 가지고 있다. 두 배열은 N개의 원소로 구성되어 있으며, 배열의 원소는 모두 자연수이다.

동빈이는 최대 K번의 바꿔치기 연산을 수행할 수 있는데, 바꿔치기 연산이란 배열 A에 있는 원소 하나와 배열 B에 있는 원소 하나를 골라서 두 원소를 서로 바꾸는 것을 말한다.

동빈이의 최종목표는 배열 A의 모든 원소의 합이 최대가 되도록 하는 것이며, 여러분은 동빈이를 도와야 한다.

N, K, 그리고 배열 A와 B의 정보가 주어졌을 때, 최대 K번의 바꿔치기 연산을 수행하여 만들 수 있는 배열 A의 모든 원소의 합의 최댓값을 출력하는 프로그램을 작성하시오.

 

  • 나의 풀이
n, k = map(int,input().split())
listA = sorted(list(map(int,input().split())))
listB = sorted(list(map(int,input().split())), reverse=True)

for i in range(k):
    if listA[i]<listB[i]:
        listA[i], listB[i] = listB[i], listA[i]

print(sum(listA))

- 코드에 break문이 없는데 이러면 경우에 따라 최대 합을 가지는 리스트를 만들지 못할 수도 있음

 

  • 답안 예시 코드
n, k = map(intz input().split()) # N과 K를 입력받기
a = list(map(int, input().split())) # 배열 A의 모든 원소를 입력받기
b = list(map(int, input().split())) # 배열 B의 모든 원소를 입력받기


a.sort() # 배열 A는 오름차순 정렬 수행
b.sort(reverse=True) # 배열 B는 내림차순 정렬 수행

# 첫 번째 인덱스부터 확인하며, 두 배열의 원소를 최대 K번 비교
for i in range(k):
	# A의 원소가 B의 원소보다 작은 경우
	if a[i] < b[i]: # 두 원소를 교체
		a[i], b[i] = b[i], a[i]
	else: # A의 원소가 B의 원소보다 크거나 같을 때, 반복문을 탈출
		break

print(sum(a)) # 배열 A의 모든 원소의 합을 출력

 

 

 

Reference

이것이 취업을 위한 코딩 테스트다 with 파이썬 - 나동빈 저