본문 바로가기

그 땐 Algorithm했지/그 땐 Python했지

[TAVE/이코테] ch06 정렬 | 실전 문제

728x90

참고자료: 이것이 코딩테스트다

실전 - 위에서 아래로
data_count = int(input())
data_list = []
for _ in range(data_count):
    data_list.append(int(input()))

data_list = sorted(data_list, reverse = True)

for data in data_list:
    print(data, end = ' ')

👉🏻가장 익숙한 정렬 라이브러리를 사용해보았다.

  1. data_list에 숫자를 받아 저장한다.
  2. sorted를 이용해 정렬한다. 이 때 reverse = True로 설정하면 내림차순으로 정렬할 수 있다.
  3. 마지막으로 for문을 이용해 출력했다. end = ' ' 를 이용해 각 숫자를 공백으로 구분했다.
실전 - 성적이 낮은 순서로 학생 출력하기
student_count = int(input())
student_and_grade_dict= {}

#각 학생과 성적을 각각 키와 값으로 만들어 student_and_grade_dict에 넣어준다.
#ex) {'홍길동': 95, '이순신': 77}
for _ in range(student_count):
    student_and_grade = input().split(' ')
    student = student_and_grade[0]
    grade = int(student_and_grade[1])
    student_and_grade_dict[student] = grade

#sorted에 key를 정해주어 정렬했다.
answer = sorted(student_and_grade_dict.items(), key = lambda item : item[1])

for i in answer:
    print(i[0], end = ' ')

👉🏻이번에는 sorted에 key를 지정해 사용해보았다.

  1. 먼저 for문을 통해 student_and_grade_dict 딕셔너리에 학생을 key로 점수를 value로 해서 저장했다.
  2. sorted의 key는 lambda 함수를 이용해 딕셔너리의 value값으로 지정해서 정렬했다.
실전 - 두 배열의 원소 교체
N, K = map(int, input().split())

list1 = list(map(int, input().split()))
list2 = list(map(int, input().split()))

list1 = sorted(list1)
list2 = sorted(list2, reverse=True)

for i in range(K):
    list1[i], list2[i] = list2[i], list1[i]

print(sum(list1))

👉🏻아래와 같이 풀었다!

  1. 동빈이의 리스트는 오름차순, 다른 리스트는 내림차순으로 정렬해 각각 list1, list2로 정리했다.
  2. for문을 돌리며 첫 번째 원소부터 차례대로 k번 바꿔치기 했다.
N, K = map(int, input().split())

list1 = list(map(int, input().split()))
list2 = list(map(int, input().split()))

list1 = sorted(list1)
list2 = sorted(list2, reverse=True)

for i in range(K):
    if list1[i] < list2[i]:
        list1[i], list2[i] = list2[i], list1[i]
    else: #동빈의 원소가 크거나 같은 경우 바꿔치기를 중단한다.
        break

print(sum(list1))

✍🏻책 풀이를 읽으며 내가 놓친점이 있다는 것을 깨달았다. 바로 바꿔치기를 하다가 동빈의 리스트 원소가 다른 사람의 원소보다 크거나 같을 때의 경우 예외처리를 해줘야 한다는 점이다. 그 점을 고려하면 코드는 위과 같다.

728x90