coding-test-python

2주차: 클래스, 배열, 링크드 리스트, 이진 탐색

2주차

클래스

class Person:
	def __init__(self, param_name):
		print("test", self) // self 는 자기 자신을 의미
		self.name = param_name
		
	def talk(self):
		print("안녕하세요 저는", self.name, "입니다")

person_1 = Person("test1")
person_2 = Person("test2")

Array

  • 배열의 경우에는 위치를 바꾸기 위해 하나하나 이동해야한다.
  • 각 원소에 즉시 접근할 수 있다. (인덱스를 통해)
  • 배열은 크기가 정해진 데이터 공간이다.

Linked List

  • 원소에 접근하기 위해 이전 원소들을 거쳐서 지나가야한다.
  • 링크드 리스트는 크기가 정해지지 않은 데이터 공간이다. 따라서 자유롭게 늘리거나 줄일 수 있다.
  • 각 원소는 노드, 연결되는 부분은 포인터라고 한다.
  • 링크드 리스트는 맨 첫 번째 노드인 head node를 head에 저장한다.

구현

  • 노드
  • 포인터
class Node:
	def __init__(self, data):
		self.data = data
		self.next = None

class LinkedList:
    def __init__(self, value):
        self.head = Node(value)

    def append(self, value):
        cur = self.head
        while cur.next != None:
            cur = cur.next
        cur.next = Node(value)

    def print_all(self):
        cur = self.head
        while cur != None:
            print(cur.data)
            cur = cur.next

    def get_node(self, index):
        # 최대 길이를 모름
        cur = self.head
        count = 0
        while cur != None:
            if count == index:
                return cur
            else:
                count += 1
                cur = cur.next

        # 강의에서 제공한 방식
        # while count != index:
        #     cur = cur.next
        #     count += 1

        return cur

    def add_node(self, index, value):
        # A -> B -> C
        # A -> B -> X -> C (B.next = X, X.next = C)
        new_node = Node(value)
        if index == 0:
            new_node.next = self.head
            self.head = new_node
            return

        prev_node = self.get_node(index - 1)
        next_node = prev_node.next
        prev_node.next = new_node
        new_node.next = next_node

        # cur = self.head
        # count = 0
        # while count != index:
        #     cur = cur.next
        #     count += 1
        # prev = cur
        # cur = Node(value)
        #
        # cur.next = prev.next
        # prev.next = cur.head

    def delete_node(self, index):
        if(index == 0):
            self.head = self.head.next

        prev_node = self.get_node(index-1)
        next_node = self.get_node(index+1)
        prev_node.next = next_node

정리

ArrayLinked List
데이터에 접근하는 경우가 빈번하다면 Array 사용이 유리하다.삽입과 삭제가 빈번하다면 Linked List 사용이 유리하다.

이진 탐색

이진 탐색은 반드시 정렬된 배열의 경우에만 수행이 가능하다.

연산량이 절반씩 낮아지는 경우 대부분O(log(N)) 이라고 생각하면 된다.

finding_target = 14
finding_numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]

def is_existing_target_number_binary(target, array):
    current_min = 0
    current_max = len(array) - 1
    current_guess = (current_min + current_max) // 2

    while current_min <= current_max:
        if array[current_guess] == target:
            return True
        elif array[current_guess] < target:
            current_min = current_guess + 1
        else:
            current_max = current_guess - 1
        current_guess = (current_min + current_max) // 2

    return False

result = is_existing_target_number_binary(finding_target, finding_numbers)
print(result)

재귀 함수

자기 자신을 호출하는 함수

반드시 빠져나가는 지점을 지정해주어야한다.