본문 바로가기

전체 글

(112)
[알고리즘 강의] 파트9. 연결 리스트(Linked Lists) (3) 연결 리스트가 힘을 발휘할 때 - 삽입과 삭제가 유연하다는 것이 가장 큰 장점 - 그런데 잠깐, 지난번에 구현한 코드는 삽입과 삭제에 효율적이지 못함 삽입과 삭제가 유연하다는 장점을 살리기 위해 새로운 메서드들을 만들자: - insertAfter(prev, newNode)-> 근데 맨 앞에는 어떻게? - popAfter(prev) -> 근데 맨 앞에서는 어떻게? 해결 방법: 조금 변형된 연결 리스트 class LinkedList: def __init__(self): self.nodeCount = 0 self.head = Node(None) self.tail = None self.head.next = self.tail 연산 정의 1. 길이 얻어내기 2. 리스트 순회 3. 특정 원소 참조(k번째) 4. 원소..
[알고리즘 강의] 파트8. 연결 리스트(Linked Lists) (2) 연결 리스트 연산 - 원소 삽입 def insertAt(self, pos, newNode): 1) pos가 가리키는 위치에 (1 prev 없음 -> Head 조정 피료 (2) 삽입하려는 위치가 리스트 맨 끝일 때 -> Tail 조정 필요 (3) 빈 리스트에 삽입할 때? -> (1), (2) 두 조건에 의해 처리됨 #참고: 전체 코드 class Node: def __init__(self, item): self.data = item self.next = None class LinkedList: def __init__(self): self.nodeCount = 0 self.head = None self.tail = None def __repr__(self): if self.nodeCount == 0: retu..
[알고리즘 강의] 파트7. 연결 리스트(Linked Lists) (1) 추상적 자료구조(Abstract Data Structures) Data 정수, 문자열, 레코드, ... A set of operations 삽입, 삭제, 순회, ... 정렬, 탐색, ... 기본적 연결 리스트 Node Node: Data + link (next) Node 내의 데이터는 다른 구조로 이루어질 수 있음 (예) 문자열, 레코드, 또 다른 연결 리스트 등 리스트의 맨 앞 노드: Head (위에선 67) 리스트이 맨 뒤 노드: Tail (위에선 58) # of nodes: 3 자료 구조 정의 Node Data Link (next) # Node class Node: def __init__(self,item): self.data = item #67 self.next = None #다음 노드를 가리키는..
[알고리즘 강의] 파트6. 알고리즘의 복잡도(Complexity of Algorithms) 시간 복잡도(Time Complexity) 문제의 크기와 이를 해결하는데 걸리는 시간 사이의 관계 공간 복잡도(Space Complexity) 문제의 크기와 이를 해결하는데 필요한 메모리 공간 사이의 관계 평균 시간 복잡도(Average Time Complexity) 임의의 입력 패턴을 가정했을 때 소요되는 시간의 평균 최악 시간의 복잡도(Worst-case Time Complexity) 가장 긴 시간을 소요하게 만드는 입력에 따라 소요되는 시간 Big-O Notation 점근 표기법(asymptotic notation)의 하나 어떤 함수의 증가 양상을 다른 함수와의 비교로 표현(알고리즘의 복잡도를 표현할 때 흔히 쓰임) O(logn), O(n), O(n^2), O(2^n) 입력의 크기가 n일 때, O(..
[알고리즘 강의] 파트5. 재귀 알고리즘(Recursive Algorithms) 응용 재귀함수란? 하나의 함수에서 자신을 다시 호출하여 작업을 수행하는 것 조합의 수 계산하기 문제) n개의 서로 다른 원소에서 m개를 택하는 경우의 수 정답) nCm=n! / (m!(n-m)!) from math import factorial as f def combi(n,m): return f(n) / (f(m)*f(n-m)) 조합의 수 계산 - 재귀적 방법 nCm = n-1Cm + n-1Cm-1 -> 특정한 하나의 원소 입장에서 볼 때, 이 원소를 포함하는 경우와 그렇지 않은 경우를 따로 계산해서 더한다. #올바르지 않은 구현 def combi(n,m): return combi(n-1,m) + combi(n-1,m-1) # Trivial case를 고려하지 않은 실수! #올바른 구현 def combi(n..
[알고리즘 강의] 파트4. 재귀 알고리즘(Recursive Algorithms) 기초 재귀함수(recursive functions)란? 하나의 함수에서 자신을 다시 호출하여 작업을 수행하는 것 생각보다 많은 종류의 문제가 재귀적으로(recursively)해결 가능 예) 이진 트리(binary trees) 왼쪽 서브트리의 원소들은 모주 작거나 같을 것 오른쪽 서브트리의 원소는 모두 클 것 이 원칙을 모든 노드에 대해서 적용! 실습 코드 - 피보나치 순열 구현 def solution(x): if x==0: return 0 elif x==1: return 1 else: return solution(x-1)+solution(x-2) * 프로그래머스의 '어서와! 자료구조와 알고리즘은 처음이지?' 강의를 듣고 정리하였습니다.
[알고리즘 강의] 파트3. 배열 더 알아보기: 정렬과 탐색(Sorting & Searching) Python 리스트 정렬 (1) sorted() 내장함수 정렬된 새로운 리스트를 얻어냄 (2) sort() 리스트의 메서드(method) 해당 리스트를 정렬함 L=[3,8,2,7,6,10,9] L2=sorted(L) # L2는 [2,3,6,7,8,9,10] # L은 [3,8,2,7,6,10,9] # L과 L2는 다름 L.sort() # L은 [2,3,6,7,8,9,10] # L의 정렬이 바뀜 정렬의 순서를 반대로: reverse=True (내림차순) L2=sorted(L, reverse=True) L.sort(reverse=True) 문자열로 이루어진 리스트의 경우 정렬 순서는 사전 순서(알파벳 순서) (문자열 길이가 긴 것이 더 큰 것이 아님) 문자열 길이 순서로 정렬하려면? -> 정렬에 이용하는 키(..
[알고리즘 강의] 파트1, 파트2 정리 파트1. 어서와! 자료구조와 알고리즘을 왜 배워야 하는지 알려줄게 파이썬의 datatype - 문자열(str) - 리스트(list) - 사전(dict) - 순서쌍(tuple), 집합(set),... 알고리즘이란? - 사전적 정의: 어떤 문제를 해결하기 위한 절차, 방법, 명령어들의 집합 - 프로그래밍: 주어진 문제의 해결을 위한 자료구조와 연산 방법에 대한 선택 파트2. 선형 배열(Linear Array) - 배열: 원소들을 순서대로 늘어놓은 것 - index가 존재 (0,1,2...) 리스트(배열) 연산 (1) 원소 덧붙이기 .append() (2) 끝에서 꺼내기 .pop() 순식간에 (빠르게) 할 수 있는 일 → 리스트의 길이와 무관(상수 시간) -> O(1) (3) 원소 삽입하기 L=[20,37,5..