리스트의 정렬

hyuckhoon.ko·2022년 7월 21일
0

프로그래머스

목록 보기
3/15
post-thumbnail

플랫폼: 프로그래머스
강의명: 어서와! 자료구조와 알고리즘은 처음이지?
강사명: 이시윤


사람은 왜 정리를 할까?
나중에 편하게 찾기 위함이다.

정렬 돼 있어야 쉽게 탐색할 수 있는 것이다.
찾는 스트레스를 줄여주고, 정리된 상태는 기분을 좋게 한다.

소프트웨어 세계도 그러하다.


1. sorted()

1) 오름차순 정렬

디폴트는 오름차순 정렬이다.
(reverse=False)

>> L = [3, 6, 2, -1, 50, 13, 37, 8]
>> ordered_L = sorted(L)
>> ordered_L
[-1, 2, 3, 6, 8, 13, 37, 50]

2) 내림차순 정렬

>> L = [3, 6, 2, -1, 50, 13, 37, 8]
>> rev_ordered_L = sorted(L, reverse=True)
>> rev_ordered_L
[50, 37, 13, 8, 6, 3, 2, -1]

2. sort()

이번엔 리스트의 메소드를 활용해보자.

1) 오름차순 정렬

>>> L = [77, 55, 99, 22, 33, 66]
>>> L.sort()
>>> L
[22, 33, 55, 66, 77, 99]

# 이번엔 reverse=False 사용
>>> L = [77, 55, 99, 22, 33, 66]
>>> L.sort(reverse=False)
>>> L
[22, 33, 55, 66, 77, 99]

2) 내림차순 정렬

# reverse=True 사용
>>> L = [77, 55, 99, 22, 33, 66]
>>> L.sort(reverse=True)
>>> L
[99, 77, 66, 55, 33, 22]

3. 문자 정렬

위에서 수로만 구성된 요소들의 정렬을 봤다.
수는 대소비교가 직관적이라 sort 메소드의 결과가 예상 가능했다.

하지만, 문자열로만 구성된 리스트에선 어떨까? 🧐

>>> L = ['a', 'A']
>>> L.sort()
>>> L
['A', 'a']

ord()

ord() 내장 함수로 문자의 아스키값을 구할 수 있다.

자동차 기업들을 정렬시켜보자.

>>> car_brands = [
    "Benz",
    "KIA",
    "HYUNDAI",
    "Tesla",
    "Ford",
    "TOYOTA",
    "BMW",
    "NISSAN",
    "Volvo",
    "JAGUAR"
]
>>> car_brands.sort()
>>> car_brands
['BMW', 'Benz', 'Ford', 'HYUNDAI', 'JAGUAR', 'KIA', 'NISSAN', 'TOYOTA', 'Tesla', 'Volvo']

4. 문자와 수로 구성된 리스트의 정렬은 가능한가?

결과를 미리 상상해보자

L = ["Baking", "123", 55]

위 리스트는 정렬가능한가?
"Baking"의 "B"의 아스키코드로 자동 변환시켜 정렬시켜줄까?

안타깝게도 정렬할 수 없다
TypeError: '<' not supported between instances of 'int' and 'str'

>>> L = ["Baking", "123", 55]
>>> L.sort()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: '<' not supported between instances of 'int' and 'str'

에러 항목에서도 볼 수 있듯이
자료형 str, int는 대소비교할 수 없다.

물론 불가능한 것은 아니다.
정렬 기준은 다음과 같다.
'55' -> 55
55 -> 55
"Baking" -> ord("B") -> 66

순서도를 그려보면 아래와 같다.

>>> L
['Baking', '123', 55]
>>> res = sorted(L, key=lambda x: x if isinstance(x, int)
             else (ord(x[0]) if x.isalpha() else int(x)))

>>> res
[55, 'Baking', '123']

5. 문자열 길이 순서로 정렬 가능할까?

>>> L = [
    "BigO",
    "Array",
    "Hash Table",
    "Stack",
    "Queue",
    "Tree",
    "Graph",
    "SORTING",
    "BFS",
    "DFS",
    "Dynamic Programming",
    "dijkstra",
]
>>> res = sorted(L, key=lambda x: len(x))
>>> res
['BFS', 'DFS', 'BigO', 'Tree', 'Array', 'Stack', 'Queue', 'Graph', 'SORTING', 'dijkstra', 'Hash Table', 'Dynamic Programming']

6. dict의 key의 값으로 정렬해보자


>>> L = [
    {"name": "Coffee", "score": 87},
    {"name": "Greek Yogurt", "score": 70},
    {"name": "Meat", "score": 92},
]
>>> res = sorted(L, key=lambda x: x["score"])
>>> res
[
    {'name': 'Greek Yogurt', 'score': 70},
    {'name': 'Coffee', 'score': 87},
    {'name': 'Meat', 'score': 92}
]

0개의 댓글