http://www.pythontutor.com/visualize.html

 

Visualize Python, Java, JavaScript, C, C++, Ruby code execution

Write code in Python 3.6 Python 2.7 Python 3.6 with Anaconda (experimental) Java 8 C (gcc 4.8, C11) C++ (gcc 4.8, C++11) JavaScript ES6 TypeScript 1.4 Ruby 2.2 Someone is typing ... Visualize Execution Live Programming Mode hide exited frames [default] sho

www.pythontutor.com

가끔 머리가 알고리즘을 못 따라 갈 때 유용한 사이트이다.

문제

수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때 걷는다면 1초 후에 X-1 또는 X+1로 이동하게 된다. 순간이동을 하는 경우에는 1초 후에 2*X의 위치로 이동하게 된다.

수빈이와 동생의 위치가 주어졌을 때, 수빈이가 동생을 찾을 수 있는 가장 빠른 시간이 몇 초 후인지 구하는 프로그램을 작성하시오.

입력

첫 번째 줄에 수빈이가 있는 위치 N과 동생이 있는 위치 K가 주어진다. N과 K는 정수이다.

출력

수빈이가 동생을 찾는 가장 빠른 시간을 출력한다.

 

from collections import deque

n, k = map(int, input().split())
Max = 100001
array = [0] * Max

def bfs():
    
    q = deque([n])
    
    while q:
        
        now_pos = q.popleft()
        
        if now_pos == k:
            return array[now_pos]

        for next_pos in now_pos - 1, now_pos + 1, now_pos * 2:
            
            if 0 <= next_pos < Max and not array[next_pos]:
                
                array[next_pos] = array[now_pos] + 1
                q.append(next_pos)
                
print(bfs())

 

bfs를 배우고 첫 bfs문제 였는데

어려웠다. 앞에서 배운 visited를 안쓰고 array를 활용해야 해서 생소했다.

아직까지는 새로운 유형에 바로바로 적용하기가 어렵다.

그래도 실력이 늘어가는 뿌듯한 느낌

'Algorithms > 패캠 알고리즘 강의' 카테고리의 다른 글

백준 - 2606  (0) 2020.04.21
백준 - 1260  (0) 2020.04.21
백준 - 1495  (0) 2020.04.03
백준 - 9251  (0) 2020.04.03
백준 - 11053  (0) 2020.04.02

문제

신종 바이러스인 웜 바이러스는 네트워크를 통해 전파된다. 한 컴퓨터가 웜 바이러스에 걸리면 그 컴퓨터와 네트워크 상에서 연결되어 있는 모든 컴퓨터는 웜 바이러스에 걸리게 된다.

예를 들어 7대의 컴퓨터가 <그림 1>과 같이 네트워크 상에서 연결되어 있다고 하자. 1번 컴퓨터가 웜 바이러스에 걸리면 웜 바이러스는 2번과 5번 컴퓨터를 거쳐 3번과 6번 컴퓨터까지 전파되어 2, 3, 5, 6 네 대의 컴퓨터는 웜 바이러스에 걸리게 된다. 하지만 4번과 7번 컴퓨터는 1번 컴퓨터와 네트워크상에서 연결되어 있지 않기 때문에 영향을 받지 않는다.

어느 날 1번 컴퓨터가 웜 바이러스에 걸렸다. 컴퓨터의 수와 네트워크 상에서 서로 연결되어 있는 정보가 주어질 때, 1번 컴퓨터를 통해 웜 바이러스에 걸리게 되는 컴퓨터의 수를 출력하는 프로그램을 작성하시오.

입력

첫째 줄에는 컴퓨터의 수가 주어진다. 컴퓨터의 수는 100 이하이고 각 컴퓨터에는 1번 부터 차례대로 번호가 매겨진다. 둘째 줄에는 네트워크 상에서 직접 연결되어 있는 컴퓨터 쌍의 수가 주어진다. 이어서 그 수만큼 한 줄에 한 쌍씩 네트워크 상에서 직접 연결되어 있는 컴퓨터의 번호 쌍이 주어진다.

출력

1번 컴퓨터가 웜 바이러스에 걸렸을 때, 1번 컴퓨터를 통해 웜 바이러스에 걸리게 되는 컴퓨터의 수를 첫째 줄에 출력한다.

 

n = int(input())
m = int(input())
adj = [[] for _ in range(n + 1)]
visited = [False] * (n + 1)
count = 0

for _ in range(m):
    
    x, y = map(int, input().split())
    adj[x].append(y)
    adj[y].append(x)
    
def dfs(v):
    
    global count
    
    visited[v] = True
    
    for e in adj[v]:
        if not visited[e]:
            count += 1
            dfs(e)
            
    return count

dfs(1)
print(count)

dfs를 배우고 나서 첫문제였다.

그렇게 크게 어렵지는 않았다. 재밌는 느낌

'Algorithms > 패캠 알고리즘 강의' 카테고리의 다른 글

백준 - 1697  (0) 2020.04.21
백준 - 1260  (0) 2020.04.21
백준 - 1495  (0) 2020.04.03
백준 - 9251  (0) 2020.04.03
백준 - 11053  (0) 2020.04.02