그리디 알고리즘 Greedy = 탐욕 말 그대로 각 단계에서 가장 욕심을 부려서 최선의 선택을 하는 것 근데 이게 결과적으로 최선의 선택으로 통하는 경우 / 통하지 않는 경우가 있다. 당연히 그리디 알고리즘은 이 탐욕법이 통하는 문제에 쓰는 것 1417 국회의원 선거 오랜만에 알고리즘 하니까 머리가 안돌아간다... A = 다솜, B, C 총 3명의 후보가 있다 치고, A: 5, B: 7, C: 7 A+B+C = 19, 19/3 = 6.xxx.... 대충 반올림하면 7 이고 -5 하면 2 이렇게 생각해봤다 (사실 더 생각하기 귀찮았다) 근데 후보 1명이면 어칼려고....... 당연히 틀렸다. 그래서 다시 생각을 해봤다. A 기준 B, C 를 정렬하면 5 < 7, 7 한명을 매수하면 6 | 6, 7 다시 정..
25644 최대 상승 import sys input = sys.stdin.readline n = int(input()) nums = list(map(int, input().split())) ans, benefit = 0, 0 for i in range(len(nums)-1, -1, -1): benefit = max(benefit, nums[i]) ans = max(ans, benefit - nums[i]) print(ans) 1904 01타일 n = int(input()) dp = [0 for _ in range(n+1)] dp[0] = 1 dp[1] = 1 if n > 1: dp[2] = 2 for i in range(3, n+1): dp[i] = (dp[i-1] + dp[i-2])%15746 prin..
2589 보물섬 import sys from collections import deque input = sys.stdin.readline s, g = map(int, input().split()) maps = [] for _ in range(s): maps.append(list(input())) dxdy = [(0,1), (0,-1), (1,0), (-1,0)] def bfs(i,j): q = deque() q.append((i, j)) visited = [[False]* g for _ in range(s)] visited[i][j] = 1 length = 0 while q: x, y = q.popleft() for i in range(4): dx = dxdy[i][0] dy = dxdy[i][1] nx..
모든 순간의 다익 + dp로 생각하면 될듯 11403 경로 찾기 import sys input = sys.stdin.readline N = int(input()) graph = [] for _ in range(N): graph.append(list(map(int, input().split()))) for i in range(N): for j in range(N): for k in range(N): if graph[j][k] == 1 or (graph[j][i] == 1 and graph[i][k] == 1): graph[j][k] = 1 for x in graph: for y in x: print(y, end = " ") print("") 1389 케빈 베이컨의 6단계 법칙 import sys input..
최단 거리 알고리즘 18352 특정 거리의 도시 찾기 import sys import heapq input = sys.stdin.readline INF = int(1e9) N, M, K, X = map(int, input().split()) graph = [[] for _ in range(N+1)] distance = [INF] * (N+1) for _ in range(M): a, b = map(int, input().split()) graph[a].append((b, 1)) def dijk(start): # 시작 노드 넣으면 q = [] heapq.heappush(q, (0, start)) # 힙큐에 스타트 노드 넣고 distance[start] = 0 # 당연히 거리는 0 while q: # 큐가 안..
정렬 정렬 알고리즘 5문제 풀기 백준 1181 단어 정렬 n = int(input()) words = [] for _ in range(n): words.append(input()) words = list(set(words)) words.sort() words.sort(key = lambda x:len(x)) for x in words: print(x) 백준 3273 두 수의 합 import sys n = int(input()) nums = list(map(int, sys.stdin.readline().rstrip().split())) nums.sort() x = int(input()) cnt = 0 left = 0 right = len(nums) - 1 while left < right: tmp = nu..
DFS/BFS 깊이 우선 탐색 / 넓이 우선 탐색 설명은 이전 글에 있으니 생략하겠다. 백준 2644 촌수계산 from collections import deque n = int(input()) p1, p2 = map(int, input().split()) m = int(input()) relat = [] res = [] visited = [False] * (n+1) for _ in range(m): x, y = map(int, input().split()) relat.append([x, y]) relat.append([y, x]) graph = [[]] for i in range(1, n+1): temp = [] for x in relat: if x[0] == i: temp.append(x[1]) gr..
그리디 그리디는 현재 순간에서 최고의 선택을 하는 알고리즘 1789 수들의 합 s = int(input()) hap = 0 ans = 0 while s >= hap: ans += 1 hap += ans if s < hap: break print(ans - 1) 1449 수리공 항승 n, l = map(int, input().split()) leak = list(map(int, input().split())) leak.sort() start = leak[0] cnt = 1 for x in leak[1:]: if x in range(start, start + l): continue else: start = x cnt += 1 print(cnt) 11501 주식 t = int(input()) for _ in ..
다이나믹 프로그래밍 효율적인 알고리즘을 위해 사용할 수 있는 기법. top-down(메모이제이션, 하향식) / bottom-up(상향식) 방식이 있다. 간단하게 설명하면 문제를 작은 문제부터 해결하여 큰 문제의 답을 도출하는 방식. 백준 17202 핸드폰 번호 궁합 a = list(input()) b = list(input()) data = [] for i in range(len(a)): data.append(a[i]) data.append(b[i]) dp = [0 for _ in range(15)] for i in range(len(data)-1): dp[i] = (int(data[i]) + int(data[i+1])) % 10 for i in range(14, 1, -1): for j in range..
이진 탐색 데이터 탐색 시 매우 빠른 속도를 자랑하는 알고리즘이다. 이진 탐색을 보기 이전에 순차 탐색부터 알아보자. 순차 탐색 순차 탐색은 말 그대로 특정 데이터를 찾기 위해 앞에서부터 하나씩 확인하는 방법이다. 시간만 충분하다면 상관없지만, 코딩 테스트 같은 경우 순차 탐색을 사용할 시 시간 초과가 발생하기 쉽다. def sequential_search(n, target, arr): for i in range(n): if arr[i] == target: return i + 1# 현재의 위치 순차 탐색 이진 탐색은 반으로 쪼개면서 탐색하는 방법이라 생각하면 된다. 이미 정렬되어 있는 데이터에 사용 가능하며, 매우 빠르게 탐색을 할 수 있다. 위치를 나타내는 변수(포인터)가 3개가 필요한데, 시작점, 끝..