본문 바로가기

728x90
반응형
SMALL

자료구조, 알고리즘

(8)
트리 벌써 마지막 장에 와버렸습니다. 마지막은 트리에 대해서 공부합니다. 우선 트리는 루트, 리프, 비단말 노드, 자식, 부모, 형제, 조상, 자손, 레벨, 차수, 서브트리, 빈 트리 등의 용어를 사용합니다. 트리 구조는 다단계랑 비슷합니다. 루트: 다단계 맨 윗 사람 리프: 가장 마지막에 있는 사람 비단말 노드: 리프를 제외한 노드 자식: 아래쪽 노드 부모: 윗쪽 노드 형제: 부모가 같은 노드 조상: 윗쪽으로 가며 만나는 모든 노드 자손: 아래쪽으로 가며 만나는 모든 노드 레벨: 루트 레벨 0 -> 에서 아래쪽으로 가며 1씩 증가함 차수: 노드가 갖는 자식의 수 높이: 루트 -> 리프의 거리 서브트리: 한 노드를 루트로 한 새로운 트리 빈 트리: 노드, 가지가 없는 트리 순서트리: 형제 간 순서 관계가 있음..
리스트 오늘은 선형리스트와, 연결리스트에 대해 알아보겠습니다. 선형리스트 선형리스트는와 연결리스트는 리스트 중 가장 단순한 연결 구조로 되어있습니다. 선형 리스트 동일한 자료형들이 순서를 갖습니다. 인덱스로 접근할 수 있기 때문에 접근이 빠르고 관리하기 편하다는 장점이 있는 반면, 자료 삽입, 삭제시 자료의 인덱스가 변해 최대 O(n)의 시간 복잡도를 가지기에 느리다는 단점과 배열으로 구현하기 때문에 갖는 메모리 비효율성이 있습니다. 연결리스트 연결리스트에선 원소를 노드라 합니다. 그리고 노드는 데이터와 뒤쪽 노드를 가리키는 포인터를 갖습니다. 그럼 포인터로 이용한 연결 리스트, 커서로 이용한 연결 리스트, 원형 이중 연결 리스트를 구현한 예시를 보여드리겠습니다. 1.포인터를 이용한 연결 리스트 이 것은 lee..
문자열 오늘은 부분 문자열 검색의 부르트포스법, KMP법, 보이어∙무어법에 대해서 공부하려 합니다. :) 부르트포스법은 단순 선형 검색을 확장한 알고리즘으로 단순법이라고 합니다. 이를 응용한 예제 문제를 풀어보겠습니다. https://www.acmicpc.net/problem/1120 1120번: 문자열 길이가 N으로 같은 문자열 X와 Y가 있을 때, 두 문자열 X와 Y의 차이는 X[i] ≠ Y[i]인 i의 개수이다. 예를 들어, X=”jimin”, Y=”minji”이면, 둘의 차이는 4이다. 두 문자열 A와 B가 주어진다. 이때, A의 www.acmicpc.net import sys import heapq A, B = sys.stdin.readline().strip().split() def checkGapCo..
정렬 알고리즘 - 2 오늘은 남은 셸 정렬, 퀵 정렬, 병합 정렬, 힙 정렬, 도수 정렬을 정리합니다. :) 1. 셸 정렬 단순 삽입 정렬의 업그레이드 판입니다. (아쉽게도 백준에서 쉬운 예제를 찾지 못했습니다. 😩) 아주 쉬운 예를 들면, 단순 삽입 정렬의 겨우, [10, 9, 8, 7, 6, 5, 4, 3, 2, 1] 배열을 정렬할 때, 바로 옆의 값을 확인하고 교환하다보니 54번의 저장이 이루어집니다. #예시 코드 및 결과 import sys n, k = 10, 54 a = [10, 9, 8, 7, 6, 5, 4, 3, 2, 1] n = len(a) count = 0 flag1 = False for i in range(1, n): if k == 0: break j = i tmp = a[i] flag2 = False #대..
정렬 알고리즘 - 1 정렬이란 데이터의 집합을 어떠한 기준의 대소관계를 따져 일정한 순서로 줄지어 세우는 것이며 정렬의 목적은 대게 탐색을 위해 또 이진 탐색이 가능한 데이터를 만들기 위해서 입니다. :) 사실 Timsort 알고리즘 (삽입정렬 + 병합정렬)이 Python, Java, Android, Google chrome, swift 등에서 표준 정렬 알고리즘으로 채택된 정렬 방법이지만 정렬 방법의 기초를 다지기 위해서 쓰는 글이니만큼 이번엔 8가지 기본정렬 방법, 그리고 그중 버블정렬, 단순 선택 정렬, 단순 삽입 정렬에 대해 먼저 공부하려 합니다. 1. 버블 정렬 이웃한 두 원소의 대소 관계를 비교해 필요에 따라 교환하는 방법으로 단순 교환 정렬이라고도 합니다. https://www.acmicpc.net/problem..
재귀 알고리즘 재귀는 한자로 다시 재再 돌아오다 귀歸를 씁니다. 말 그대로 함수를 재차 사용합니다. python의 경우 최대 재귀 깊이(maximum recursion depth)가 1,000으로 일반적인 적인 계산에선 필요없지만 코테에서 유명한 dfs(깊이 우선 탐색)의 문제 경우 1000으로 해결되지 않는 경우가 대부분이기에 파이썬으로 코테를 준비하는 사람의 경 sys.setrecursionlimit() 을 처음 접하는 사람은 거의 없을거라 생각합니다 :) 다음은 재귀로 유명한 유클리드 호제법 문제와 풀이 입니다. https://www.acmicpc.net/problem/2609 2609번: 최대공약수와 최소공배수 첫째 줄에는 입력으로 주어진 두 수의 최대공약수를, 둘째 줄에는 입력으로 주어진 두 수의 최소 공배수..
검색 알고리즘 뇌빼고 코테 준비하다가 한계에 부딪혀서 쓰는 포스팅입니다. :-) 우선 검색 알고리즘은 집합에서 원하는 값의 원소를 찾는 알고리즘 입니다. 오늘은 유명한 검색 알고리즘 종류 3가지 중 (배열검색, 연결 리스트 검색, 이진 검색 트리) 배열검색에 대해 그리고 그 중에서도 선형 검색, 이진 검색, 해시법에 대해 공부하려합니다. 첫번째로 선형 검색의 경우 브루트 포스(BruteForce), 완전 탐색이라고도 하며 배열 전체를 처음부터 원소를 찾을 때까지. 혹은 찾지 못할 경우 끝까지 확인합니다. 보통 for 문 while 문을 사용하며 시간복잡도 O(n)을 갖습니다. 예제 문제 https://school.programmers.co.kr/learn/courses/30/parts/12230 두번째로 이진 검색입니..
스택, 큐 알아보기 이유 모르고 코테 준비를 하면서 쓰게된 스택, 큐에 대해 정확히 공부하려 포스팅합니다. :) 우선 대강이나마 알고 있던 사실을 두서없이 쓰면 1. 스택 -> 후입선출 2. 큐 -> 선입선출 3. 스택과 큐 모두 자료 입출력에 O(1)의 시간복잡도를 가짐. queue의 경우 Python에서 List에서 pop(0) 을 하게 될 경우 O(n) 시간 복잡도를 가지기 때문에 collections deque 모듈을 사용해서 구현해야하고, ( dequeue -> 선입 선출, 선입 후출 모두 가능 ) Swift에서 removefirst 를 할 경우도 O(n) 의 시간 복잡도를 가지기 때문에 따로 클래스를 구현해서 사용 해야함. 구현 내용은 Swift 언어로 코테를 준비하면서 정리한 내용에 정리해놓음 ( dequeue..

728x90
반응형
LIST