2024/10 11

[Python] 냅색(KnapSack) 알고리즘

배낭 문제라고도 불리는 냅색 알고리즘은 DP 문제 중 일부이다.주어진 물건들 중 일부를 선택하여 제한된 용량의 가방(또는 배낭)에 최대한의 가치를 담는 문제를 해결하는 알고리즘 물건을 넣을 것인가, 안넣을 것인가를 정하는 것이 문제의 핵심이다. 평범한 배낭 문제를 이용하여 원리를 알아보겠다https://www.acmicpc.net/problem/12865 일단 예제 1을 보면4 7 # 물품 수 n 과 최대 무게 k # 각 물품의 무게와 가치6 13 4 83 65 12  물품 수 n+1 (아무 물품도 넣지 않았을 때)를 행으로무게 k+1 (무게가 0일 때)를 열로 한2차원 표를 만든다2차원 표 안에는 가치가 들어간다.각 행의 물건을 넣었을 때, 넣지 않았을 때의 가치를 비교해서 더 큰 값을 넣어준다 안넣는..

카테고리 없음 2024.10.31

[백준/Python] 동물원

https://www.acmicpc.net/problem/1309 DP를 사용 맨 위의 두 칸을 세 가지 경우로 나눈다- 공백: 두 칸에 아무도 없음- 좌: 왼쪽 칸에 사자 있음- 우: 오른쪽 칸에 사자 있음 만약 n이 1이라면위처럼 세 가지 경우가 있습니다  n이 2인 경우를 보겠습니다 그런데 아래 칸(파란색)의 경우의 수는n=1일 때의 경우의 수와 같습니다  즉 맨 위의 두 칸이 공백이면 n-1의 모든 경우의 수가 올 수 있고,왼쪽만 있으면 n-1의 경우의 수 중 공백과 오른쪽이 채워져 있는 경우가 올 수 있고,오른쪽만 있으면 n-1의 경우의 수 중 공백과 왼쪽이 채워져 있는 경우가 올 수 있습니다. dp 점화식으로 풀게 된다면# 0번 째는 공백(사자 없음), 1번 째는 왼쪽에 사자, 2번 째는 오른..

[Python] 음수 간선 벨만 포드 알고리즘

https://www.youtube.com/watch?v=Ppimbaxm8d8&list=LL&index=36 벨만 포드 음의 간선이 있는 경우음수 간선 순환이 생기는 지도 알 수 있다시간 복잡도 O(VE)(다익스트라는 O(ElogV)) 벨만 포드 알고리즘1. 출발 노드 설정2. 최단 거리 테이블 무한으로 초기화3. 전체 간선을 돌면서 최단 거리 테이블 갱신3번을 노드 -1 만큼 반복 음수 간선 순환이 발생하는 지 확인하는 방법3을 한 번 더 반복해서 최단 거리 테이블이 또 갱신되면 음수 간선 순환이 발생(즉 3을 노드만큼 반복하면 된다) n: 노드 수m: 간선 수distance: 최단 거리 테이블edges: 간선 정보 벨만 포드 함수def bf(start, distance): distance[sta..

카테고리 없음 2024.10.26

[Pandas] 데이터 변형하기 - groupby

1. groupby()2. pd.pivot(), pd.pivot_table()3. stack(), unstack() 실습을 위한 라이브러리 임포트import numpy as npimport pandas as pdimport seaborn as sns 팁 데이터 사용tips = sns.load_dataset('tips') 데이터 살펴보기tips.head()tips.info()groupby()컬럼 값이 같은 것끼리 그룹화한다 # 성별로 묶기group_sex = tips.groupby('sex')# 객체를 리턴group_sex  그룹의 속성이 보고 싶다면groups()group_sex.groups  groupby의 함수 활용- count: 데이터 수 - size: 집단 별 크기 - sum: 합 - mean: ..

빅데이터 공부 2024.10.22

[FastAPI] 파일 전송

2024.09.24 - [분류 전체보기] - [FastAPI] 파이썬으로 서버 만들기 [FastAPI] 파이썬으로 서버 만들기파이썬으로 서버를 만들기 위한 프레임 워크1. Flask2. Django 3. FastAPI 이 중 쉽고 빠른 FastAPI로 서버를 만들어 보겠습니다.FastAPI 장점: 비동기 지원동기: 클라이언트 요청이 오면 하나를 처리하고dogfoot1.tistory.com 2024.09.25 - [분류 전체보기] - [FastAPI] 데이터 받기 [FastAPI] 데이터 받기2024.09.24 - [분류 전체보기] - [FastAPI] 파이썬으로 서버 만들기 [FastAPI] 파이썬으로 서버 만들기파이썬으로 서버를 만들기 위한 프레임 워크1. Flask2. Django 3. FastAPI..

카테고리 없음 2024.10.21

[백준/Python] 이진 검색 트리

https://www.acmicpc.net/problem/5639 입력, 재귀를 위한 limit 제한import sysinput = sys.stdin.readlinesys.setrecursionlimit(10**9) 1. 트리 만들어서 postorder 하기2. 트리 없이 리스트로 postorder 하기 3. 인덱스를 이용해서 postorder하기   1. 트리 만들어서 postorder 하기 트리 클래스 생성class Node: def __init__(self, node): self.node = node self.left = None self.right = None # 추가 함수 def plus(self, res): # res: 들어오는 값 ..

[Python/백준] 트리 순회

전위 순회(preorder): A -> B -> C중위 순회(inorder): B -> A -> C후위 순회(postorder): B -> C -> A  https://www.acmicpc.net/problem/1991 재귀 함수를 이용  입력 및 트리 만들기import sysinput = sys.stdin.readlinen = int(input())tree = {}for _ in range(n): a, b, c = input().split() tree[a] = [b,c] # 0번 인덱스는 왼쪽 1번 인덱스는 오른쪽 print(tree){'A': ['B', 'C'], 'B': ['D', '.'], 'C': ['E', 'F'], 'E': ['.', '.'], 'F': ['.', 'G'], ..

[백준/Python] 트리의 부모 찾기

https://www.acmicpc.net/problem/11725 각 노드마다 연결되어있는 노드를 저장하는 이차원 리스트를 만든다각 노드가 방문 여부를 저장하는 리스트를 만든다부모 노드를 저장하기 위한 parents라는 리스트를 만든다 -> DFS import sysinput= sys.stdin.readlinedef dfs(node): st = [node] while st: v = st.pop() for n in graph[v]: if visited[n] == False: parents[n] = v visited[n] = True st.append(n)n = i..

[백준/Python] 특정한 최단 경로

https://www.acmicpc.net/problem/1504 방법은노드 1 -> 노드 v1 -> 노드 v2 -> 노드 n노드 1 -> 노드 v2 -> 노드 v1 -> 노드 n두 가지 중 최소 경로를 구하고, 만약 INF 보다 크거나 같다면 -1을 출력하면 되는 문제였습니다.  일단 이 문제를 플로이드 워셜로 푸려고 했습니다(이유는.. 800 ** 3을 1억번보다 더 적게 나온다고 잘못 계산해서..)import sysinput = sys.stdin.readlineINF = int(1e9)n, e = map(int, input().split())graph = [[INF]*(n+1) for _ in range(n+1)]for i in range(1, n+1): graph[i][i] = 0 fo..

[Python/백준] 운동

https://www.acmicpc.net/problem/1956 저는 노드가 400개이기 때문에400 ^ 3이 1억번보다 적어 플로이드 워셜 알고리즘을 사용해야겠다고 생각했습니다 import sysinput = sys.stdin.readlineINF = int(1e9)v, e = map(int, input().split())graph = [[INF]*(v+1) for _ in range(v+1)]for i in range(1, v+1): graph[i][i] = 0 for _ in range(e): a, b, c = map(int, input().split()) graph[a][b] = c # 단방향 for k in range(1, v+1): for i in range(..