본문 바로가기

알고리즘/백준 (Pyhthon)

(79)
[알고리즘] 백준 17269 이름궁합 테스트 / python https://www.acmicpc.net/problem/17269 17269번: 이름궁합 테스트 시윤이는 좋아하는 이성이 생기면 가장 먼저 이름궁합부터 본다. 이름궁합을 보는 방법은 간단하다. 먼저 이름을 알파벳 대문자로 적는다. 각 알파벳 대문자에는 다음과 같이 알파벳을 적는데 필요한 획수가 주어진다. 예를 들어, 두 사람의 이름인 LEESIYUN, MIYAWAKISAKURA 를 같이 표현했을 때 다음과 같이 먼저 주어진 이름부터 한 글자씩 적는다. 두 사람의 이름을 알파벳 대문자로 표현한 뒤, 한 글자씩 번갈아가며 적는다. 예시 : L M E www.acmicpc.net import copy dic = {'A':3,'B':2,'C':1,'D':2,'E':4,'F':3,'G':1,'H':3,'I':1..
[알고리즘] 백준 9251 LCS / python https://www.acmicpc.net/problem/9251 9251번: LCS LCS(Longest Common Subsequence, 최장 공통 부분 수열)문제는 두 수열이 주어졌을 때, 모두의 부분 수열이 되는 수열 중 가장 긴 것을 찾는 문제이다. 예를 들어, ACAYKP와 CAPCAK의 LCS는 ACAK가 된다. www.acmicpc.net X와 Y의 문자열이 같다면, dp[i][j] = 대각선+1 X와 Y의 문자열이 다르다면, dp[i][j] = max(왼쪽값, 위값) X = input() Y = input() dp = [ [0] * (len(Y)+1) for _ in range(len(X)+1) ] for i in range(len(X)): for j in range(len(Y)): i..
[알고리즘] 백준 11053 가장 긴 증가하는 부분수열 / python https://www.acmicpc.net/problem/11053 11053번: 가장 긴 증가하는 부분 수열 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이고, 길이는 4이다. www.acmicpc.net n = int(input()) arr = list(map(int, input().split(' '))) dp = [1] * n for i in range(1, n): for j in range(0, i): if arr[j] < arr[i]: dp[i] = max(dp[i], dp[j]+1) print..
[알고리즘] 백준 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 전형적인 DP문제! 이해하느라 애먹었다 ㅠ D[i][j] = 배낭에 넣은 물품의 무게 합이 j일 때 얻을 수 있는 최대 가치 점화식으로 표현하면, D[i][j] = D[i - 1][j] ( j < w ) D[i][j] = max( D[i - 1][j], D[i - 1][j - w]..
[알고리즘] 백준 1904 01타일 / python n = int(input()) _list = [0] * n _list[0] = 1 _list[1] = 2 for i in range(2, n): _list[i] = (_list[i-1] + _list[i-2]) % 15746 print(_list[n-1]) DP문제는 점화식을 세우자 f(n) = f(n-1) + f(n-2)
[알고리즘] 백준 1766 문제집 / 위상정렬, python import heapq n, m = map(int, input().split(' ')) num_list = [ [] for _ in range(n+1) ] indegree = [ 0 for _ in range(n+1) ] heap = [] result = [] for _ in range(m): a, b = map(int, input().split(' ')) num_list[a].append(b) indegree[b] += 1 for i in range(1, n+1): if indegree[i] == 0: heapq.heappush(heap, i) while heap: temp = heapq.heappop(heap) result.append(temp) for i in num_list[temp]: indeg..
[알고리즘] 백준 1715 카드정렬하기 / python import heapq n = int(input()) heap = [] for _ in range(n): num = int(input()) heapq.heappush(heap, num) result = 0 while len(heap) != 1: num1 = heapq.heappop(heap) num2 = heapq.heappop(heap) _sum = num1 + num2 result += _sum heapq.heappush(heap, _sum) print(result) 제일 작은 수끼리 비교할수록 최소가 되므로 최소힙을 이용한다
[알고리즘] 백준 1927 최소힙 / python import heapq import sys n = int(input()) h = [] for _ in range(n): num = int(sys.stdin.readline()) if num == 0: if not h: print(0) else: print(heapq.heappop(h)) else: heapq.heappush(h, num) heapq라이브러리를 이용해 힙을 구현 import heapq heapq.heappush(heap, item) heapq.heappop(heap) 시간초과 당해서 sys.stdin.readline()으로 바꿔씀!