본문 바로가기

알고리즘

(94)
파이썬 | 백준 | 1010 | 다리 놓기 solution 1. dp 이용 # 1010, 다리 놓기 import sys t = int(sys.stdin.readline()) dp = [[0]*30 for _ in range(30)] for i in range(30): for j in range(30): if i == 1: dp[i][j] = j else: if i == j: dp[i][j] = 1 elif i < j: dp[i][j] = dp[i-1][j-1] + dp[i][j-1] for i in range(t): n, m = map(int, sys.stdin.readline().split()) print(dp[n][m]) 29380KB 64ms dp에서 문제 고른 게 아니었으면 생각 못 했을 것 같다.. 2. 조합 이용 # 1010, 다리 놓..
파이썬 | 백준 | 7569 | 토마토 | bfs 3차원 시간초과 solution 1. 상자의 수 H → 3차원 배열 tomatoes[z][x][y] 2. 최소 일수 → BFS # 7569, 토마토 import sys from collections import deque dx = [-1, 1, 0, 0, 0, 0] dy = [0, 0, -1, 1, 0, 0] dz = [0, 0, 0, 0, -1, 1] def bfs(x,y,z): q = deque() q.append((x, y, z)) visited[z][x][y] = 1 cnt = 0 while q: a, b, c = q.popleft() for i in range(6): nx = a + dx[i] ny = b + dy[i] nz = c + dz[i] if 0
파이썬 | 백준 | 1074 | Z solution1 : 2차원 배열 1. 2차원 배열을 -1로 초기화해둔 후 재귀함수를 호출하며 1씩 증가되는 수를 저장 2. lst[r][c] 출력 # 1074, Z import sys input = sys.stdin.readline def z(x, y, k): global num if k == 2: if lst[x][y] == -1: for i in range(2): for j in range(2): lst[x+i][y+j] = num num += 1 else: z(x, y, k // 2) z(x, y + k // 2, k // 2) z(x + k // 2, y, k // 2) z(x + k // 2, y + k // 2, k // 2) N, r, c = map(int, input().split()) ..
파이썬 | 백준 | 2352 | 반도체 설계 solution 1. 1365 꼬인 전깃줄하고 비슷한 유형 https://li-fo.tistory.com/50?category=921537 2. LIS의 길이 출력 # 2352, 반도체 설계 import sys input = sys.stdin.readline def lower_bound(s, e, v): while s lst1[-1]: lst1.a..
파이썬 | 백준 | 2606 | 바이러스 solution 1. bfs : 84ms 2. dfs 이용 # 2606, 바이러스 import sys input = sys.stdin.readline def dfs(x): visited[x] = 1 global virus for i in network[x]: if not visited[i]: virus += 1 dfs(i) return virus n = int(input()) m = int(input()) network = [[] for _ in range(n+1)] for _ in range(m): a, b = map(int, input().split()) network[a].append(b) network[b].append(a) visited = [0]*(n+1) virus = 0 print(dfs(..
파이썬 | 백준 | 1992 | 쿼드트리 solution 1. 사분면을 나눌 때 괄호 추가 2. (x, y) → (y, x) # 1992, 쿼드트리 import sys def com(x, y, n): check = bw[x][y] global res for i in range(x, x + n): for j in range(y, y + n): if bw[i][j] != check: # 영상이 같은 색이 아님 print('(', end='') com(x, y, n // 2) # 1 com(x, y + n // 2, n // 2) # 2 com(x + n // 2, y, n // 2) # 3 com(x + n // 2, y + n // 2, n // 2) # 4 print(')', end='') return if check == 0: # 영상이 모두..
파이썬 | 백준 | 2644 | 촌수계산 solution 1. bfs 이용 2. 입력받은 수가 같으면 0촌 # 2644, 촌수계산 import sys from collections import deque def bfs(x, y): if x == y: return 0 visited[x-1] = 1 q = deque() q.append(x-1) while q: tmp = q.popleft() for i in fam[tmp]: if not visited[i]: visited[i] = visited[tmp] + 1 if i == y-1: return visited[tmp] q.append(i) return -1 n = int(sys.stdin.readline()) a, b = map(int, sys.stdin.readline().split()) fam..
파이썬 | 백준 | 1935 | 후위 표기식2 | 소수 둘째자리까지 출력 solution 1. 스택 이용 → 연산자면 pop() 두 번 2. print('%.2f' % n) : 소수 둘째 자리까지 출력 # 1395, 후위 표기식 2 import sys from collections import deque n = int(sys.stdin.readline()) ex = deque() ex.extend(list(sys.stdin.readline().rstrip())) num = [] for _ in range(n): num.append(int(sys.stdin.readline())) tmp = [] res = 0 while ex: x = ex.popleft() if x == '+' or x == '-' or x == '*' or x == '/': a = tmp.pop() b = t..