Python 202

[Python] 5174. subtree

후위 순회 풀이 # 후위 순회 알고리즘 / 어떤 순회를 써도 상관 X def postorder(n): global answer if n: postorder(left[n]) postorder(right[n]) answer += 1 tc = int(input()) for idx in range(1, tc+1): e, n = map(int, input().split()) # 간선의 개수 e, 시작 노드 n node = list(map(int, input().split())) # 노드 연결 정보 받아오기 left = [0 for _ in range(e+2)] # 부모를 인덱스로 자식번호 저장 right = [0 for _ in range(e+2)] for i in range(0, e*2, 2): p, c = n..

[Python] 2579. 계단오르기

n = int(input()) # 계단의 수 stairs = [int(input()) for _ in range(n)] # 계단 if n == 1: print(stairs[0]) else: dp = [0 for _ in range(n)] dp[0] = stairs[0] # 1번 계단 dp[1] = stairs[0] + stairs[1] # 1번 + 2번 계단 밟음 for i in range(2, n): # 1. 현재 계단 + 이전의 계단 + 전전전의 계단 밟은 경우 # 2. 현재 계단 + 전전의 계단 밟은 경우 # 두 경우 중 더 큰 값을 선택 dp[i] = max(dp[i-3] + stairs[i-1] + stairs[i], dp[i-2] + stairs[i]) print(dp[n-1]) 점화식을 찾는..

Algorithm/Baekjoon 2021.09.23

[Python] 1231. 중위 순회

# 중위 순회 def in_order(n): if n: in_order(left[n]) print(tree[n], end='') # 정점의 알파벳 출력 in_order(right[n]) for idx in range(1, 11): n = int(input()) tree = [0 for _ in range(n+1)] # 트리(알파벳) left = [0 for _ in range(n+1)] # 왼쪽 자식 받을거야 right = [0 for _ in range(n+1)] # 오른쪽 자식 받을거야 # 정점 정보를 받아올 때, 맨앞에 정점번호 int로 바꿔주기 귀찮으니 i로 한다. (1부터 n까지의 정수라고 주어짐) for i in range(1, n+1): info = input().split() # 정점 정보..

[Python] 5105. 미로의 거리

# 방향 벡터 / 상, 하, 좌, 우 dy = [1, -1, 0, 0] dx = [0, 0, -1, 1] # 미로탈출 bfs(시작 y좌표, 시작 x 좌표) -> 2의 위치 def bfs(sy, sx): q = [(sy, sx)] # q에 시작 좌표 넣어주고 시작 # q가 빌때까지 반복 while q: now_y, now_x = q.pop(0) # 현재 좌표 q에서 가져오기 (bfs니까 맨앞에꺼) # 상하좌우 탐색 for i in range(4): # 이동해볼 좌표 설정 (현재 위치 + 방향 벡터가 가리키는 곳) next_y = now_y + dy[i] next_x = now_x + dx[i] # 이동해볼 곳이 미로 범위 안에 있다 ? if 0

[Python] 5102. 노드의 거리

def bfs(s, g): q = [s] # 큐 생성 및 시작점 넣어주기 while q: now = q.pop(0) # 큐의 맨 앞에서 저장된 노드 가져오기 if now == g: # 현재 노드가 목표 노드라면 중지 return for i in adj[now]: # 현재 노드에서 연결된 노드 다가져와 if not distance[i]: # 연결된 노드 i가 아직 방문 안한곳이면 q.append(i) # 방문해봐야지. q에 넣어준다. # 출발노드 ~ 노드 i 까지의 거리 = 출발노드 ~ 현재노드까지의 거리 +1 # 왜냐면 현재 노드(변수 now)에서 1칸 움직인거니까 distance[i] = distance[now] + 1 tc = int(input()) for idx in range(1, tc+1): v..

[Python] 5099. 피자굽기

tc = int(input()) for idx in range(1, tc+1): n, m = map(int, input().split()) # 화덕의 크기 n, 피자의 개수 m pizza = list(map(int, input().split())) # 만들 피자 가져오기 # 인덱스 같이 넣어줌 ex) [[7, 1], [2, 2], [6, 3], [5, 4] [3, 5]] pizza_info = [[pizza[i], i+1] for i in range(m)] fire = pizza_info[:n] # 화덕에 먼저 들어간 피자 pizza = pizza_info[n:] # 화덕에 아직 못들어간 피자 # 화덕에서 피자가 없어질때까지 반복 while fire: p, p_i = fire.pop(0) # 확인할 피자..

[Python] 1226. 미로1

# 방향 벡터 / 상, 하, 좌, 우 dy = [1, -1, 0, 0] dx = [0, 0, -1, 1] # 미로탈출 bfs(시작 y좌표, 시작 x 좌표) -> 2의 위치 def bfs(sy, sx): visited[sy][sx] = 1 q = [(sy, sx)] # q에 시작 좌표 넣어주고 시작 # q가 빌때까지 반복 while q: now_y, now_x = q.pop(0) # 현재 좌표 q에서 가져오기 (bfs니까 맨앞에꺼) # 상하좌우 탐색 for i in range(4): # 이동해볼 좌표 설정 (현재 위치 + 방향 벡터가 가리키는 곳) next_y = now_y + dy[i] next_x = now_x + dx[i] # 이동해볼 곳이 미로 범위 안에 있다 ? if 0

[Python] 1225. 암호생성기

# tc 10개 for _ in range(10): idx = int(input()) data = list(map(int, input().split())) # 현재 진행중인 사이클에서 빼야할 값의 크기를 알고 있어야 한다. cnt = 1 while data[-1] > 0: # 한 사이클은 5까지 빼는게 한 사이클이다. # 빼고자 하는 값의 크기가 5초과가 되면 다시 1로 돌아가야 한다. if cnt == 6: cnt = 1 # 첫번째에 위치한 숫자 감소한 뒤, 맨 뒤로 보낸다. data.append(data.pop(0) - cnt) cnt += 1 # 데이터 마지막 값은 0으로 고정 (음수 -> 0으로) data[-1] = 0 print('#{}'.format(idx), end=' ') print(*da..