하루기록
220720 BOJ 2579, 9375, DFS와 BFS
매우빠른거부기
2022. 7. 20. 22:59
DFS : 스택이나 재귀함수를 이용함
visited = [False] * (n+1)
def dfs(N):
visited[N] = True
print(N, end=" ")
for i in graph[N]:
if not visited[i]:
dfs(i)
******BFS : 큐를 이용함
(노드 간 비용이 같을 때 최단 거리 측정 문제에서 자주 쓰인다고 한다!!)
1) 스타트를 True 처리 + 큐에 넣어주기
2) while que(큐가 빌 때까지 반복)
3) 스타트 값을 popleft해서 추출(넣고 바로 빼기)
4) graph에서 스타트와 인접한 값들 중 방문하지 않은 것이 있따면 큐에 넣어주고, 방문했다고 하고 반복
5) 그렇게 for문이 끝나면 그땐 새롭게 늘어난 큐 값들을 빨리 넣은 순서대로 다시 반복
(큐는 먼저 넣은 순서대로 나가기 때문에, popleft 하기 전에 큐에 자꾸 넣음)
from collections import deque
def bfs(n):
visited[n] = True
que = deque([n])
while que:
v = que.popleft()
print(v, end=" ")
for i in graph[v]:
if not visited[i]:
que.append(i)
visited[i] = True
최종 정답
#1260
# cook your dish here
from collections import deque
n,m,start=map(int,input().split())
visited = [False] * (n+1)
graph = [[] for _ in range(n+1)]
for i in range(m):
a, b = map(int, input().split())
graph[a].append(b)
graph[b].append(a)
for i in range(n+1):
graph[i].sort()
def dfs(start):
visited[start] = True
print(start, end= " ")
for i in graph[start]:
if not visited[i]:
dfs(i)
def bfs(start):
visited[start] = True
que = deque([start])
while que:
v = que.popleft()
print(v, end=" ")
for i in graph[v]:
if not visited[i]:
visited[i] = True
que.append(i)
dfs(start)
visited = [False] * (n+1)
print("")
bfs(start)
#dp #2579 #계단오르기
n = int(input())
s = [0 for i in range(301)]
dp = [0 for i in range(301)]
for i in range(n):
s[i] = int(input())
dp[0] = s[0]
dp[1] = s[0] + s[1]
dp[2] = max(s[0], s[1]) + s[2]
for i in range(3, n):
dp[i] = max(dp[i-3] + s[i-1], dp[i-2]) + s[i]
print(dp[n-1])
#딕셔너리 #9375 #패션왕 신해미
t = int(input())
for i in range(t):
n = int(input())
weardict = {}
for j in range(n):
wear = list(input().split())
if wear[1] in weardict:
weardict[wear[1]].append(wear[0])
else:
weardict[wear[1]] = [wear[0]]
cnt = 1
for k in weardict:
cnt = cnt * (len(weardict[k])+1)
print(cnt-1)