It 17

[자료구조] Priority Queue(우선순위 큐)(Python)

* 개요 Priority Queue(우선순위 큐)는 선입선출 구조를 가지는 일반적인 큐의 자료구조와는 달리, 데이터의 삽입은 순서와 관계가 없지만 삭제할 때는 우선순위가 높은 원소부터 삭제가 되는 자료구조이다. 우선순위 큐의 대표적인 예로 heap이 있다. * Heap(힙) heap(힙)은 여러 개의 값 중에서 가장 크거나 가장 작은 값을 빠르게 찾기 위해 만든 이진 트리이다. 힙의 종류에는 최대 힙과 최소 힙이 있는데, 최대 힙은 root 노드에 가장 큰 값이 들어가게 되며, 최소 힙은 root 노드에 가장 작은 값이 들어가게 된다. 힙의 데이터 삽입 및 삭제의 시간 복잡도는 O(logN)이 소요된다. * 파이썬으로 구현한 우선순위 큐(최소 힙) 우선순위 큐를 위해서 파이썬에 내장되어 있는 heapq ..

[자료구조] Queue(큐)(Python)

* 개요 Queue(큐)는 선입선출(First In First Out)의 자료구조를 뜻한다. 대기열이라고도 한다. 데이터가 들어오는 위치는 가장 뒤(rear 또는 back)에 있고, 데이터가 나가는 위치는 가장 앞(front)이다. 큐를 응용한 형태의 큐로는 원형 큐(Circular Queue), 우선순위 큐(Priority Queue) 등이 있다. 보통 배열을 사용해서 큐를 구현하면, enqueue(rear에 데이터 추가)와 dequeue(front의 데이터 삭제)를 할 때마다 계속 데이터가 앞으로 밀려나는 문제가 생기는데, 이를 해결하기 위해 원형 버퍼(원형 큐)를 사용한다. 원형 큐는 이후 포스트에서 다룰 예정이다. * 파이썬으로 구현한 큐(리스트) 큐를 리스트로 구현하였다. class Queue:..

[알고리즘] 프로그래머스 - 타겟 넘버(Python)

코딩테스트 연습 - 타겟 넘버 | 프로그래머스 스쿨 (programmers.co.kr) 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr * 문제 설명 n개의 음이 아닌 정수들이 있습니다. 이 정수들을 순서를 바꾸지 않고 적절히 더하거나 빼서 타겟 넘버를 만들려고 합니다. 예를 들어 [1, 1, 1, 1, 1]로 숫자 3을 만들려면 다음 다섯 방법을 쓸 수 있습니다. -1+1+1+1+1 = 3 +1-1+1+1+1 = 3 +1+1-1+1+1 = 3 +1+1+1-1+1 = 3 +1+1+1+1-1 = 3 사용할 수 있는 숫자가 담긴 배열 numbers, 타겟 넘버..

[자료구조] Stack(스택)(Python)

* 개요 Stack(스택)은 후입선출(Last In First Out - LIFO) 특성을 가지는 자료구조이다. 즉, 데이터의 삽입과 삭제가 메모리의 한 쪽 끝에서만 나타난다고 할 수 있다. 메모리에 새로 들어오는 데이터(push)의 위치가 메모리의 말단에 위치하고, 이를 '탑 포인터'라고 일컫는다. 내보내는 데이터(pop) 역시 메모리의 말단을 거친다. 스택의 추상 자료형(Abstract Data Type - ADT)을 살펴보면, 입력 연산은 push, 출력 연산은 pop이다. 조회 연산은 peek라고 하는데, 탑 포인터가 가리키는 데이터를 조회만 할 뿐, 인덱스에 변화를 주지는 않는다. 스택은 흔히 크기를 고정해서 사용하기 때문에, 이를 다 사용하면 데이터가 넘치게 된다. 이에 대한 대처방안이 존재하..

[자료구조] Circular LinkedList(원형 연결리스트)(Python)

* 개요 이번 포스트에서 다룰 내용은 Circular LinkedList(원형 연결리스트)이다. 원형 연결리스트는 단순 연결리스트에서 마지막 노드가 None이 아닌 첫 노드를 참조하는 형태의 자료구조이다. 바로 원형 연결리스트에 대해 알아보도록 하자. * Circular LinkedList(원형 연결 리스트) Circular LinkedList는 리스트가 비어있지 않으면 어떤 노드도 None을 가지고 있지 않기 때문에 프로그램에서 None 조건을 검사하지 않아도 된다는 장점을 지니고 있다. 그러나 이전 노드를 쉽게 참조할 수 있었던 이중 연결리스트와는 달리, 역방향으로 노드를 순회하기 쉽지 않으며, 무한 루프가 발생할 수도 있다는 단점을 가지고 있다. 해당 단점을 보완한 원형 연결 리스트가 존재하긴 한다..

[자료구조] Doubly LinkedList(이중 연결리스트)(Python)

* 개요 이번 포스트에 다룰 내용은 Doubly LinkedList(이중 연결리스트)이다. 이전 노드를 참조할 수 없어 단방향으로만 노드에 접근이 가능했던 SIngly LinkedList(단순 연결리스트)와 달리 Doubly LinkedList(이중 연결리스트)는 이전 노드 참조가 가능하다. 또한 양방향으로 노드에 접근할 수 있어 삽입/삭제/탐색이 단순 연결리스트에 비해 속도가 더 빠르다는 특징이 있다. * Doubly LinkedList(이중 연결리스트) Doubly LinkedList(이중 연결리스트)는 다음 노드의 참조 뿐만이 아니라 이전 노드의 참조도 같이 가리킬 수 있다. 뒤로 탐색하는게 빠르다는 단순한 장점 외에도 한 가지 장점이 더 있는데, 단순 연결리스트는 현재 가리키고 있는 노드를 삭제하..

[자료구조] Singly LinkedList(단순 연결 리스트)(Python)

* 개요 오늘부터 자료구조를 공부하기로 했다. 백준이나 프로그래머스 문제를 풀면서 자료구조와 알고리즘의 필요성에 대해 알게 되었기 때문이다. 백준 같은 경우 테스트 케이스가 워낙 방대하고 많기에, 자료구조와 알고리즘을 제대로 쓰지 않을 경우 시간 초과가 나는 경우가 종종 발생한다.(보통 테스트 케이스가 10만을 넘어간다면, 시간 복잡도 O(N^2)의 코드를 짰을 때 99퍼센트 확률로 시간 초과가 발생한다.) 자료구조는 컴공과 커리큘럼 기준으로 2학년 과정이지만, 필자는 학부 2학년 시절 코포자(코딩포기자)였기 때문에... 프로그래밍 관련 수업은 제대로 듣질 않았다.(그래서 학점이 개판이다...) 먼저 스터디 멤버들과 자료구조 스터디 커리큘럼에 대해 고민을 해보았는데, 먼저 LinkedList(연결 리스트..