자료구조와 알고리즘 3강

자료구조와 알고리즘 3강

Posted by 동식이 블로그 on September 14, 2019

3강: 정렬(Sort), 탐색(Search)

배열 - 정렬(sort)과 탐색(search)

정렬이란?

  • 복수의 원소로 주어진 데이터를 정해진 기준에 따라 새로 늘어놓는 작업

  • Python의 리스트는 내장된 정렬기능이 있다

    • 파이썬 내장 함수 : sorted()

      • 정렬된 새로운 리스트를 얻어냄
    • 리스트에 쓸 수 있는 메서드 : sort()

      • 해당 리스트를 정렬
    • 정렬의 순서를 반대로 : reverse=True

      1
      2
      
      L = sorted(L, reverse=True)
      L.sort(reverse=True)
      
    • 함수와 메서드의 차이를 구분해야 한다

  • 수치(number)가 아닌 데이터형의 정렬?
    • 문자열을 사전에 등장하는 순서에 따라 정렬한다

    • 문자열의 길이가 더 길다고 해서 더 큰 문자로 취급하는 것이 아니다

    • Python은 대문자가 소문자에 비해서 무조건 우선

    • 문자열 길이 순서로 정렬하려면?

      • 정렬에 이용하는 키(key)를 지정해서 정렬할 수 있다(lambda)
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      
      # 예제 1
      L = ['abcd', 'xyz', 'spam']
      sorted(L, key=lambda x: len(x))
      ## abcd와 spam의 순서는 처음 정의했을 순서대로 출력
      >> ['xyz', 'abcd', 'spam']
          
      # 예제 2
      L = [{'name':'John', 'score':83},
          {'name':'Paul', 'score':92}]
      ## lambda를 이용해 레코드들을 이름 순서대로 정렬하기
      L.sort(key=lambda x: x['name'])
      ## 레코드들을 점수 높은 순으로 정렬
      L.sort(key=lambda x: x['score'], reverse=True)
      


탐색이란?

  • 복수의 원소로 이루어진 데이터에서 특정 원소를 찾아내는 작업

  • 선형탐색(linear serach), 순차탐색(sequential search)

    • 순차적으로 모든 요소들을 탐색하여 원하는 값을 찾아냄
    • 배열의 길이에 비례하는 시간이 걸리므로 O(n), 최악의 경우에는 배열에 있는 모든 원소를 다 검사해야 할 수 있다.
    1
    2
    3
    4
    5
    6
    7
    8
    
    def linear_search(L, x):
      i = 0
      while(i < len(L) and L[i] != x):
        i += 1
      if(i < len(L)):
        return i
      else:
        return -1
    
  • 이진탐색(binary search)

    • 탐색하려는 배열이 이미 정렬되어 있는 경우에만 적용이 가능
    • 크기 순으로 정렬되어 있다는 성질 이용
    • 한 번 비교가 일어날 때마다 리스트 반씩 줄임(divide & conquer)
    • O(log n)


생각해 봐야 할 점

  • 이진탐색이 선형 탐색보다 빠르기는 하다
  • 하지만 이진탐색을 사용하려면 우선 배열을 정렬해야 하는데, 크기 순으로 정렬하는것은 금방 가능한가?
    • 정렬에 대한 복잡도를 생각해 봐야 한다
  • 한 번만 탐색하고 말거라면, 굳이 크기 순으로 늘어놓느라 시간을 소모하는 것 보다 한번씩 다 뒤지는 것이 낫지 않은지?


실습

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# binary search 구현
def solution(L, x):
    answer = 0
    middle = 0
    start = 0
    cnt = 0
    end = len(L)-1
    if(x not in L):
        return -1
    else:
        while(start <= end):
            middle = (start + end) // 2
            if(L[middle] == x):
                answer = middle
                break
            elif(L[middle] < x):
                start = middle + 1
            elif(L[middle] > x):
                end = middle - 1
        return answer


본 문서는 프로그래머스 어서와! 자료구조와 알고리즘 강의를 수강하고 정리했습니다.

출처 : 프로그래머스 : 어서와! 자료구조와 알고리즘은 처음이지?