본문 바로가기
728x90

TIL - 프로그래밍/개념, 설정44

[Python] 부분집합 - 순열1 1. [1,2,3]의 부분집합 구하기 def f(i,N): # i부분집합에 포함될지 결정할 원소의 인덱스, N 전체 원소개수 if i == N : # 한개의 부분집합 완성 print(bit, end=' ') for j in range(N): if bit[j]: sum += a[j] print(a[j],end=' ') print() else: bit[i] = 1 f(i+1,N) bit[i] = 0 f(i+1,N) return a = [1,2,3] bit = [0,0,0] f(0,3) 2. 부분집합 합 구하기(sum추가) def f(i,N): # i부분집합에 포함될지 결정할 원소의 인덱스, N 전체 원소개수 if i == N : # 한개의 부분집합 완성 print(bit, end=' ') sum = 0 fo.. 2022. 3. 5.
[Python] 퀵 정렬 퀵 정렬 주어진 배열을 두 개로 분할하고, 각각을 정렬 최악의 시간 복잡도 O(n^2), 합병정렬보다 좋지 못하다 평균적으로 가장 빠름( O(nlogn)) 합병정렬과 다른점 합병정렬은 그냥 두 부분으로 나누는 반면에, 퀵정렬은 분할할 때, 기준 아이템(pivot item) 중심으로, 기준보다 작은 것은 왼쪽, 큰 것은 오른쪽으로 위치 각 부분 정렬이 끝난 후, 합병정렬은 합병이란 후 처리 작업이 필요하나, 퀵정렬은 필요하지 않음 def quickSort(a,begin,end): if begin < end: p = partition(a,begin,end) quickSort(a,begin,p-1) quickSort(a,p+1,end) def partition(a,begin,end): pivot = (begi.. 2022. 3. 1.
[Python] 백트래킹 (Backtracking) 기법 백트래킹 기법 해를 찾는 도중에 '막히면' (즉, 해가 아니면) 되돌아가서 다시 해를 찾아가는 기법 최적화(optimization) 문제와 결정(dicision) 문제를 해결 결정문제 : 문제의 조건을 만족하는 해가 존재하는지 여부 Y/N 답하기 어떤 노드에서 출발하는 경로가 해결책으로 이어지지 않을 것 같다고 결정되면 그 노드의 부모로 되돌아가(Backtracking) 다음 자식 노드로 가기 (Prunning 가지치기) 예 - 미로 찾기, n-Queen 문제, Map coloring, 부분 집합의 합(Subset Sum) 문제 등 def checknode(v): # node # 유망하면(어떤 노드를 방문하였을 때 그 노드를 포함한 경로가 해답의 가능성이 있다면) if promising(v): if th.. 2022. 2. 28.
[Python] 깊이 우선 탐색(DFS : Depth First Search) 비선형구조인 그래프 구조는 그래프로 표현된 모든 자료를 빠짐없이 검색하는 것이 중요하다. 2가지 방법( 깊이 우선 탐색(DFS), 너비 우선 탐색(BFS)) DFS 시작 정점의 한 방향으로 갈 수 있는 경로가 있는 곳까지 깊이 탐색해 가다가 더 이상 갈 곳이 없게 되면, 가장 마지막에 만났던 갈림길이 있는 정점으로 되돌아와서 다른 방향의 정점으로 탐색을 계속 반복하여 결국 모든 정점을 방문하는 순회방법 가장 마지막에 만났던 갈림길의 정점으로 되돌아가서 다시 깊이 우선 탐색을 반복해야 하므로 후입선출 구조의 스택 사용 DFS 알고리즘 시작 정점 v를 결정하여 방문 정점 v에 인접한 정점 중 방문하지 않은 정점 w가 있으면, 점점 v를 push하고 정점 w를 방문 -> 2. 반복 방문하지 않은 정점이 없으면.. 2022. 2. 26.
[Python] Fibonacci sequence (피보나치 수열) 재귀함수 def fibo(n): if n < 2: return n else: return fibo(n-1) + fibo(n-2) print(fibo(3)) # 2 print(fibo(4)) # 3 print(fibo(5)) # 5 print(fibo(6)) # 8 print(fibo(7)) # 13 단점 : 엄청난 중복 호출이 존재한다. 메모이제이션(memoization) 컴퓨터 프로그램을 실행할 때 이전에 계산한 값을 메모리에 저장해서 매번 다시 계산하지 않도록 하여 전체적인 실행 속도를 빠르게 하는 기술이다. 동적 계획법의 핵심이 되는 기술 피보나치 수를 구하는 알고리즘에서 fibo(n)의 값을 계산하자마자 저장하면 실행시간을 줄일 수 있다. def fibo_memoization(n): global .. 2022. 2. 26.
[Python] Stack 스택(stack)의 특성 물건을 쌓아 올리듯 자료를 쌓아 올린 형태의 자료구조이다. 스택에 저장된 자료는 선형 구조를 갖는다. 선형구조 : 자료 간의 관계가 1대1의 관계 비선형구조 : 자료 간의 관계가 1대N의 관계 (예 : 트리) 스택에 자료를 넣거나 꺼낼 수 있다. 후입선출(LIFO : Last-In-First-Out) 마지막 삽입된 원소의 위치 : top 삽입 : push, 삭제 : pop 스택이 공백인가 : isEmpty, 스택의 top에 있는 원소 반환 : peek class MyStack(): # top 변수를 이용해서 구현 def __init__(self): self.top = -1 self.size = 10 self.stack = [0] * self.size # item 을 마지막 요소 .. 2022. 2. 26.
반응형