728x90
반응형

알고리즘 109

[크래프톤 정글 5기] week02 알고리즘 주차 아홉번째 날, 분할 정복, 뮤터블, 그래프, 트리, DFS/BFS, 이진검색트리, 서로소집합

분할 정복(Divide and Conquer) - 여러 알고리즘의 기본이 되는 해결 방법, 엄청나게 크고 방대한 문제를 작은 단위로 쪼개어, 결과적으로 큰 문제를 해결하는 방법 - 퀵 정렬, 병합 정렬, 이분 탐색 등이 대표적 예시이다. - Divide를 제대로 나누면 Conquer은 자동으로 쉬워지기 때문에 Divide를 잘 설계하는 것이 매우 중요하다. - 분할 정복에서는 재귀 알고리즘이 많이 사용되는데, 이 부분에서 분할 정복의 효율을 깎아내릴 수 있다. 분할 정복의 설계 1. Divide(분할) - 원래의 문제를 분할하여, 비슷한 유형의 하위 문제로 더 이상 분할이 불가능할 때 까지 나눈다. 2. Conquer(정복) - 각 하위 문제를 재귀적으로 해결한다. 더 이상 나눌 수 없는 단위일 때의 탈..

[Baekjoon 1260 / python / 실버2] DFS와 BFS

from collections import deque import sys def DFS(graph, v, visited): # 인접노드리스트, 시작 노드, 방문목록 visited[v] = True print(v, end=' ') for i in graph[v]: # 현재 노드의 인접 노드로 재귀 if visited[i] == False: # 아직 안 갔으면 가기 DFS(graph, i, visited) def BFS(graph, start, visited): # 인접노드리스트, 시작 노드, 방문목록 queue = deque([start]) # 큐에 시작 노드 넣기 visited[start] = True while queue: v = queue.popleft() # 큐에서 노드 빼고 출력 print(v, ..

Algorithm/DFS 2024.03.29

[Baekjoon 5639 / python / 골드5] 이진 검색 트리

import sys sys.setrecursionlimit(10**9) # 재귀호출 최대 깊이를 늘려준다 pre = [] # 전위순회 순서 입력받기 while True: try: n = int(sys.stdin.readline()) pre.append(n) except: break def postOrder(nodeList): # 전위순회 결과를 입력받는다 생각지 말고, 그냥 노드 리스트를 입력받는다 생각하면 이해가 편함 if len(nodeList) == 0: # 빈 리스트라면 return return left, right = [], [] root = nodeList[0] # root노드 기준으로 작은값, 큰값으로 나눈다 for i in range(1, len(nodeList)): # root노드 다음값..

Algorithm/Graph 2024.03.29

[Baekjoon 1991 / python / 실버1] 트리 순회

import sys n = int(sys.stdin.readline()) tree = {} for _ in range(n): root, left, right = sys.stdin.readline().split() tree[root] = [left, right] # {'root' : ['left', 'right']} 형태로 저장한다 def preorder(root): # 전위 순회 if root != '.': print(root, end='') preorder(tree[root][0]) preorder(tree[root][1]) def inorder(root): # 중위 순회 if root != '.': inorder(tree[root][0]) print(root, end='') inorder(tree[r..

Algorithm/Graph 2024.03.29

[Baekjoon 1992 / python / 실버1] 쿼드트리

n = int(input()) # 변의 길이 board = [list(map(int, input().rstrip())) for _ in range(n)] # rstrip() 하면 개행문자 제거해서 한번에 입력할 수 있게 해준다 def quadTree(x, y, n): # x, y좌표와 변 길이를 입력받는다, 첫 호출은 0,0을 입력 color = board[x][y] for i in range(x, x+n): for j in range(y, y+n): # 현재 사각형의 모든 칸을 검사한다 if color != board[i][j]: # 색깔이 다른 칸이 하나라도 있다면 4등분 재귀호출 한다 print('(', end='') # 출력 양식에 맞게 괄호 입력 quadTree(x, y, n//2) # 출력 양..

[Baekjoon 1629 / python / 실버1] 곱셈

def dac(a, b, c): # a^b % c if b == 1: return a % c elif b % 2 == 0: # b가 짝수일 때 return (dac(a, b//2, c)**2) % c else: return ((dac(a, b//2, c)**2)*a) % c a, b, c = map(int, input().split()) print(dac(a, b, c)) 분할 정복 알고리즘이 사용되며, (a ^ b) % c 의 결과를 출력하기만 하면 되는 문제이다. 그러나 주어지는 입력값이 int의 최대값인 21억 정도로 매우매우 크다. 시간 제한도 0.5초로 매우 짧기 때문에 일반적인 연산으로는 시간 초과가 뜬다. 때문에 수학 공식을 이용하여 작은 단위로 분할하여 연산 횟수를 줄여서 계산해야 한다. ..

Algorithm/Math 2024.03.27

[Baekjoon 3190 / python / 골드4] 뱀

import sys from collections import deque n = int(sys.stdin.readline()) # 보드의 크기 k = int(sys.stdin.readline()) # 사과의 개수 apple = [list(map(int, sys.stdin.readline().split())) for _ in range(k)] # 사과의 위치 l = int(sys.stdin.readline()) # 방향 전환 횟수 change = [] for _ in range(l): changeSec, changeDir = input().split() changeSec = int(changeSec) change.append([changeSec, changeDir]) # 초, 방향을 입력받되, 초는 int..

[Baekjoon 2630 / python / 실버2] 색종이 만들기

import sys n = int(sys.stdin.readline()) # 종이 길이 paper = [list(map(int, sys.stdin.readline().split())) for _ in range(n)] # 종이와 색깔 result = [] # 결과를 담을 변수 def cut(x, y, n): # 행, 열 시작지점과 종이 길이를 입력받는다 color = paper[x][y] # 종이 색깔 비교를 위한 색깔 저장 for i in range(x, x + n): for j in range(y, y + n): if color != paper[i][j]: # 다른 색깔이 존재할 경우 종이를 4등분한다 cut(x, y, n//2) cut(x+n//2, y, n//2) cut(x, y+n//2, n//..

[크래프톤 정글 5기] week01 알고리즘 주차 여섯번째 날, 해시 테이블, 힙, 우선순위 큐, 이진 트리, 피보나치

해시 테이블(Hash Table)- 먼저 키(key)와 값(value)으로 구성된 데이터가 필요하다.- 여기서 “key”를 해시값으로 만들어, 해당 해시값을 “인덱스”로써 활용하여 테이블에 저장한다. 여기서 해시값은 정수 형태가 된다.- 데이터(value)를 해시하여 인덱스로 쓰는 거 아니냐는 사람들이 있는데, 이럴 경우 value가 같으면 인덱스가 중복될 수 있다. 해시함수는 같은 입력에 대해서 항상 같은 해시값을 만들기 때문이다.- 어떤 값을 찾든 O(1)의 복잡도를 가진다. 고유값으로 접근하면 되기 때문.- 해시 테이블에서 만들어진 원소를 버킷(Bucket)이라고 한다. 해시 테이블의 장/단점- 장점 : 자료의 검색, 읽기, 저장 속도가 빠르다. 즉 데이터 조회가 빠르다.- 장점 : 자료가 중복되는..

728x90
반응형