swea 78

[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] 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..

[Python] 4881. 배열 최소합

# 배열 선택 함수 (진행할 행, 이전까지의 선택 숫자들의 합) def select(y, temp_sum): global min_sum # 행의 맨 마지막까지 갔을 경우 (더이상 갈 곳 없으면) if y == n: # 만약 여태 더한 값이 min_sum에 저장되어 있는 값보다 작다면 갱신하고 돌아가기 if temp_sum < min_sum: min_sum = temp_sum return # 여태 더한 값이 이미 min_sum에 저장되어있는 값보다 크다면 들어갈 필요 없어 돌아가 if min_sum