알고리즘/백준 109

백준 1717: 집합의 표현 (Python)

https://www.acmicpc.net/problem/1717 1717번: 집합의 표현 첫째 줄에 n(1 ≤ n ≤ 1,000,000), m(1 ≤ m ≤ 100,000)이 주어진다. m은 입력으로 주어지는 연산의 개수이다. 다음 m개의 줄에는 각각의 연산이 주어진다. 합집합은 0 a b의 형태로 입력이 주어진다. 이는 www.acmicpc.net 이코테에서 풀었던 문제 그대로 나왔다. https://sssbin.tistory.com/193 그래서 알고리즘 다시 정리한다는 마음으로 내 손으로 직접 풀었지만 ,, 시간 초과로 실패 def find_parent(parent, x): if parent[x] != x: parent[x] = find_parent(parent, parent[x]) return ..

알고리즘/백준 2022.07.28

백준 11657: 타임머신 (Python)

https://www.acmicpc.net/problem/11657 11657번: 타임머신 첫째 줄에 도시의 개수 N (1 ≤ N ≤ 500), 버스 노선의 개수 M (1 ≤ M ≤ 6,000)이 주어진다. 둘째 줄부터 M개의 줄에는 버스 노선의 정보 A, B, C (1 ≤ A, B ≤ N, -10,000 ≤ C ≤ 10,000)가 주어진다. www.acmicpc.net 처음엔 예제를 봐도 문제가 이해가 잘 안 갔었다. 그래서 관련 글들을 찾아보다가,, 벨만-포드 알고리즘이라는 것을 알았다. 이 문제는 음수 간선이 존재하기 때문에 사이클을 순환할수록 가중치가 감소하는 경우가 발생한다. 따라서 일반적인 다익스트라 알고리즘으로 풀 수 없고, 벨만-포드 알고리즘으로 풀어야 한다. 예제2를 보면 사이클을 계속 ..

알고리즘/백준 2022.07.18

백준 1504: 특정한 최단 경로 (Python)

https://www.acmicpc.net/problem/1504 1504번: 특정한 최단 경로 첫째 줄에 정점의 개수 N과 간선의 개수 E가 주어진다. (2 ≤ N ≤ 800, 0 ≤ E ≤ 200,000) 둘째 줄부터 E개의 줄에 걸쳐서 세 개의 정수 a, b, c가 주어지는데, a번 정점에서 b번 정점까지 양방향 길이 존 www.acmicpc.net 반드시 통과해야만 하는 정점이 있기 때문에 1 -> v1 -> v2 -> n 1 -> v2 -> v1 -> n 다익스트라를 세번(1번 출발, v1 출발, v2 출발) 돌려서 두 값 중에 최소값을 찾아주면 된다 처음에 실패해서 찾아보니까 값을 세번 더하기 때문에 무한값을 줄여주면 된다고 해서 줄였는데 (1e9 -> 1e8) 여전히 틀림,,,, 자세히 보니..

알고리즘/백준 2022.07.12

백준 1753: 최단경로 (Python)

https://www.acmicpc.net/problem/1753 1753번: 최단경로 첫째 줄에 정점의 개수 V와 간선의 개수 E가 주어진다. (1 ≤ V ≤ 20,000, 1 ≤ E ≤ 300,000) 모든 정점에는 1부터 V까지 번호가 매겨져 있다고 가정한다. 둘째 줄에는 시작 정점의 번호 K(1 ≤ K ≤ V)가 www.acmicpc.net import heapq import sys input = sys.stdin.readline INF = int(1e9) v, e = map(int, input().split()) k = int(input()) graph = [[] for i in range(v+1)] distance = [INF] * (v+1) for _ in range(e): x, y, w =..

알고리즘/백준 2022.07.12

백준 12865: 평범한 배낭 (Python)

https://www.acmicpc.net/problem/12865 12865번: 평범한 배낭 첫 줄에 물품의 수 N(1 ≤ N ≤ 100)과 준서가 버틸 수 있는 무게 K(1 ≤ K ≤ 100,000)가 주어진다. 두 번째 줄부터 N개의 줄에 거쳐 각 물건의 무게 W(1 ≤ W ≤ 100,000)와 해당 물건의 가치 V(0 ≤ V ≤ 1,000) www.acmicpc.net n, k = map(int, input().split()) d = [[0 for _ in range(k+1)] for _ in range(n)] for i in range(n): w, v = map(int, input().split()) for j in range(1, k+1): if j < w: d[i][j] = d[i-1][j]..

알고리즘/백준 2022.04.11

백준 11053: 가장 긴 증가하는 부분 수열 (Python)

https://www.acmicpc.net/problem/11053 11053번: 가장 긴 증가하는 부분 수열 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이 www.acmicpc.net 예제) n=6, A=[10, 20, 10, 30, 20, 50] -> 길이 4 처음에 리스트 초기화 d=[1, 1, 1, 1, 1, 1] for문을 돌면서 차례대로 각 인덱스까지의 입력받은 배열 값을 비교해서 더 크면 최댓값 +1 1. 10 20 10 30 20 50 1 1 1 1 1 1 2. 10 < 20 이므로 d[..

알고리즘/백준 2022.04.07

백준 2156: 포도주 시식 (Python)

https://www.acmicpc.net/problem/2156 2156번: 포도주 시식 효주는 포도주 시식회에 갔다. 그 곳에 갔더니, 테이블 위에 다양한 포도주가 들어있는 포도주 잔이 일렬로 놓여 있었다. 효주는 포도주 시식을 하려고 하는데, 여기에는 다음과 같은 두 가지 규 www.acmicpc.net n = int(input()) a = [0] for _ in range(n): a.append(int(input())) d = [0] * (n+1) d[1] = a[1] if n >= 2: d[2] = a[1] + a[2] for i in range(3, n+1): d[i] = max(d[i-1], d[i-2] + a[i], d[i-3] + a[i-1] + a[i]) print(d[n])

알고리즘/백준 2022.04.07

백준 10844: 쉬운 계단 수 (Python)

https://www.acmicpc.net/problem/10844 10844번: 쉬운 계단 수 첫째 줄에 정답을 1,000,000,000으로 나눈 나머지를 출력한다. www.acmicpc.net n = int(input()) stair = [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0] for _ in range(n+1)] stair[1] = [0, 1, 1, 1, 1, 1, 1, 1, 1, 1] for i in range(2, n+1): for j in range(10): if j == 0: stair[i][0] = stair[i-1][1] elif j == 9: stair[i][9] = stair[i-1][8] else: stair[i][j] = stair[i-1][j-1] + stair[..

알고리즘/백준 2022.04.07

백준 1463: 1로 만들기 (Python)

https://www.acmicpc.net/problem/1463 1463번: 1로 만들기 첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다. www.acmicpc.net 채점하는데 2분 걸려서 좀 쫄았다 ㅋ 인덱스 에러 방지를 위해 배열을 n의 수만큼 설정해줌. n = int(input()) d = [0] * 1000001 d[2] = 1 d[3] = 1 for i in range(4, n+1): d[i] = d[i-1] + 1 if i % 3 == 0: d[i] = min(d[i//3] + 1, d[i]) if i % 2 == 0: d[i] = min(d[i//2] + 1, d[i]) print(d[n])

알고리즘/백준 2022.04.05