코딩하는 털보

21.12.07 TIL 본문

Diary/Today I Learned

21.12.07 TIL

이정인 2021. 12. 14. 23:45

알고리즘 문제 풀기 with Python

Array vs Linked List

image-20211207095259787

Linked List 구현하기

class Node:
    def __init__(self, data):
        self.data = data
        self.next = None

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

    def append(self, data):
        if self.head is None:
            self.head = Node(data)
            return self.head
        node = self.head
        while node.next is not None:
            node = node.next
        node.next = Node(data)
        return node.next

    def print_all(self):
        node = self.head
        while node is not None:
            print(node.data)
            node = node.next

    def get_node(self, index):
        node = self.head
        for _ in range(index):
            node = node.next
        return node

    def add_node(self, index, data):
        new_node = Node(data)
        if index == 0:
            new_node.next = self.head
            self.head = new_node
            return
        else:
            node = self.get_node(index-1)
            next_node = node.next
            node.next = new_node
            new_node.next = next_node

    def delete_node(self, index):
        if index == 0:
            self.head = self.head.next
        else:
            node = self.get_node(index-1)
            node.next = node.next.next

my_list = LinkedList(4)
my_list.append(6)
my_list.append(8)
my_list.append(10)
my_list.append(12)

my_list.print_all()
print(my_list.get_node(2).data)

my_list.add_node(3, 9)
my_list.add_node(0, 1)
print('========')
my_list.print_all()

print('========')
my_list.delete_node(3)
my_list.delete_node(0)
my_list.delete_node(4)
my_list.print_all()

이진 탐색

순차 탐색은 처음부터 끝까지 한번 순회하면서 검색하는 것.

이진 탐색은 탐색 범위를 반으로 나누어가면서 검색하는 것. (업다운)

순차 탐색의 시간복잡도가 O(N) 이고 이진 탐색의 시간복잡도는 O(logN)

재귀 함수

재귀(Recursion)은 어떠한 것을 정의할 때 자기 자신을 참조하는 것.

재귀 함수는 구현부에서 자기 자신을 호출하는 함수이다.

def count_down(number):
    print(number)          # number를 출력하고
    count_down(number - 1) # count_down 함수를 number - 1 인자를 주고 다시 호출한다!

count_down(60)

재귀 함수는 반드시 무한정 돌게하면 안된다. (무한루프, RecursionError) 재귀에서의 탈출 조건이 필요하다.

def count_down(number):
    if number < 0:
      return
    print(number)          # number를 출력하고
    count_down(number - 1) # count_down 함수를 number - 1 인자를 주고 다시 호출한다!

count_down(60)

팩토리얼

N! = N * (N-1)! = N * (N-1) * (N-2)! ...

def factorial(n):
    if n == 1:
        return 1
    return n * factorial(n-1)

print(factorial(5))

회문 검사

input = "abcba"


def is_palindrome(string):
    if len(string) <= 1:
        return True
    elif string[0] == string[-1]:
        return is_palindrome(string[1:-1])
    else:
        return False


print(is_palindrome(input))
Comments