[백준] 10815번 숫자 카드 - 파이썬
·
알고리즘 공부/이진탐색
https://www.acmicpc.net/problem/10815 10815번: 숫자 카드 첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10, www.acmicpc.net 문제를 보고 엥? 너무 쉬운데 하고 풀었는데 import sys n = int(sys.stdin.readline()) a = list(map(int, sys.stdin.readline().split())) m = int(sys.stdin.readline()) b = list(map(int, sys.stdin.readline().split())) for i in ran..
[백준] 14500번 줄 세우기(위상 정렬) - 파이썬
·
알고리즘 공부/위상정렬
https://www.acmicpc.net/problem/2252 2252번: 줄 세우기 첫째 줄에 N(1 ≤ N ≤ 32,000), M(1 ≤ M ≤ 100,000)이 주어진다. M은 키를 비교한 회수이다. 다음 M개의 줄에는 키를 비교한 두 학생의 번호 A, B가 주어진다. 이는 학생 A가 학생 B의 앞에 서야 한다는 의 www.acmicpc.net import sys from collections import deque n, m = map(int,sys.stdin.readline().split()) indegree = [0] * (n+1) graph = [[] for i in range(n+1)] for _ in range(m): a, b = map(int,sys.stdin.readline().sp..
위상 정렬
·
알고리즘 공부/위상정렬
위상 정렬은 정렬 알고리즘의 일종이다. 위상 정렬은 순서가 정해져 있는 일련의 작업을 차례대로 수행해야 할 때 사용할 수 있는 알고리즘이다. 조금 더 이론적으로 설명하자면, 위상 정렬이란 방향 그래프의 모든 노드를 '방향성에 거스르지 않도록 순서대로 나열하는 것'이다. 현실 세계에서 위상 정렬을 수행하게 되는 전형적인 예시로는 '선수과목을 고려한 학습 순서 설정' 을 들 수 있다. 예를 들어 컴퓨터공학과 커리큘럼에는 '자료구조' 과목을 수강한 뒤에 '알고리즘' 강의를 수강하는 것을 권장한다. 이때 '자료구조'및 '알고리즘'을 각각의 노드로 표현하고, '자료구조'에서 '알고리즘'으로 이어질 수 있도록 방향성을 갖는 간선을 그릴 수 있다. 다시 말해 그래프상에서 선후 관계가 있다면, 위상 정렬을 수행하여 모..
[백준] 1197번 랜선 자르기 - 파이썬
·
알고리즘 공부/이진탐색
https://www.acmicpc.net/problem/1654 1654번: 랜선 자르기 첫째 줄에는 오영식이 이미 가지고 있는 랜선의 개수 K, 그리고 필요한 랜선의 개수 N이 입력된다. K는 1이상 10,000이하의 정수이고, N은 1이상 1,000,000이하의 정수이다. 그리고 항상 K ≦ N 이다. 그 www.acmicpc.net import sys k,n = map(int, sys.stdin.readline().split()) lan = [] for i in range(k): lan.append(int(sys.stdin.readline())) lan.sort() start = 1 end = lan[-1] while start = n: start = mid + 1 else: end = mid -..
[백준] 1197번 최소 스패닝 트리(최소 신장 트리) - 파이썬
·
알고리즘 공부/신장트리-크루스칼 알고리즘
https://www.acmicpc.net/problem/1197 1197번: 최소 스패닝 트리 첫째 줄에 정점의 개수 V(1 ≤ V ≤ 10,000)와 간선의 개수 E(1 ≤ E ≤ 100,000)가 주어진다. 다음 E개의 줄에는 각 간선에 대한 정보를 나타내는 세 정수 A, B, C가 주어진다. 이는 A번 정점과 B번 정점이 www.acmicpc.net import sys def find_parent(parent,x): if parent[x] != x: parent[x] = find_parent(parent,parent[x]) return parent[x] def union_parent(parent, a, b): a = find_parent(parent, a) b = find_parent(parent..
신장트리 - 크루스칼 알고리즘
·
알고리즘 공부/신장트리-크루스칼 알고리즘
신장 트리는 그래프 알고리즘 문제로 자주 출제되는 유형이다. 기본적으로 신장트리란? 하나의 그래프가 있을 때 모든 노드를 포함하면서 사이클이 존재하지 않는 부분 그래프이다. 이때 모든 노드가 포함되어 서로 연결되면서 사이클이 존재하지 않는다는 조건은 트리의 성립 조건이기도 하다. 그래서 이러한 그래프를 신장 트리라고 부르는 것이다. 크루스칼 알고리즘 우리는 다양한 문제 상황에서 가능한 한 최소한의 비용으로 신장 트리를 찾아야 할 때가 있다. 예를 들어 N개의 도시가 존재하는 상황에서 두 도시 사이에 도로를 놓아 전체 도시가 서로 연결 될 수 있게 도로를 설치하는 경우를 생각해보자. 2개의 도시 A, B를 선택했을 때, 도시 A에서 도시 B로 이동하는 경로가 반드시 존재하도록 도로를 설치하고자 한다. 모든..
[백준] 11404번 플로이드 - 파이썬
·
알고리즘 공부/플로이드 워셜
https://www.acmicpc.net/problem/11404 11404번: 플로이드 첫째 줄에 도시의 개수 n이 주어지고 둘째 줄에는 버스의 개수 m이 주어진다. 그리고 셋째 줄부터 m+2줄까지 다음과 같은 버스의 정보가 주어진다. 먼저 처음에는 그 버스의 출발 도시의 번호가 www.acmicpc.net import sys input = sys.stdin.readline n = int(input()) m = int(input()) INF = int(1e9) graph = [[INF] *(n+1) for _ in range(n+1)] for a in range(1,n+1): for b in range(1,n+1): if a == b : graph[a][b] = 0 for _ in range(m): ..
플로이드 워셜 알고리즘
·
알고리즘 공부/플로이드 워셜
다익스트라 알고리즘은 '한 지점에서 다른 특정 지점까지의 최단 경로를 구해야 하는 경우' 에 사용할 수 있는 최단 경로 알고리즘이다. 하지만 플로이드 워셜 알고리즘은 '모든 지점에서 다른 모든 지점까지의 최단 경로를 모두 구해야 하는 경우'에 사용할 수 있는 알고리즘이다. 핵심을 이해하는 것이 중요하다. 다익스트라 알고리즘은 단계마다 최단 거리를 가지는 노드를 하나씩 반복적으로 선택한다. 그리고 해당 노드를 거쳐 가는 경로를 확인하여, 최단 거리 테이블을 갱신하는 방식으로 동작한다. 플로이드 워셜 알고리즘 또한 단계마다 '거쳐가는 노드' 를 기준으로 알고리즘을 수행한다. 하지만 매번 방문하지 않은 노드중에서 최단 거리를 갖는 노드를 찾을 필요가 없다는 점이 다르다. 노드의 개수가 N개일 때 알고리즘상으로..