CS/알고리즘_문제풀이(파이썬)

전염병

Jedy_Kim 2021. 6. 5. 18:14
728x90

문제

철수네 마을에는 갑자기 전염병이 유행하기 시작하였다. 이 전염병은 전염이 매우 강해서, 이웃한 마을끼리는 전염되는 것을 피할 수 없다. 철수네 마을은 1번부터 N번까지 번호가 매겨져 있다. 철수네 마을의 구조는 꽤나 복잡한데, i번 마을에서 출발하면 i * 2 번 마을에 갈 수 있고, 또한 i / 3(i를 3으로 나눈 몫) 번째 마을에도 갈 수 있다. 전염병은 사람에 의하여 옮는 것으로 알려져 있다. 따라서 i번 마을에 전염병이 돌게 되면, i * 2 번 마을과 i /3(i를 3으로 나눈 몫) 번 마을 역시 전염병이 돌게 된다. K번 마을이 가장 처음으로 전염병이 돌기 시작했을 때, 전염병이 돌지 않는 마을의 개수를 구하는 프로그램을 작성하시오.

 

입력

첫째 줄에 전체 마을의 개수 N과, 처음으로 전염병이 돌기 시작한 마을 번호 K가 주어진다. ( 1 ≤ N, K ≤ 100,000 )

 

출력

전염병이 돌지 않는 마을의 개수를 출력한다.

 

예제 입력

10 3

예제 출력

4

 

#코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import sys
from collections import deque
 
# i번 마을에서 출발하면
# 1) i * 2 번 마을에 갈 수 있고
# 2) i / 3(i를 3으로 나눈 몫) 번째 마을에도 갈 수 있다
 
# 따라서 i번 마을에 전염병이 돌게 되면, 
# i * 2 번 마을과 i /3(i를 3으로 나눈 몫) 번 마을 역시 전염병이 돌게 된다.
 
# K번 마을이 가장 처음으로 전염병이 돌기 시작했을 때, 
# 전염병이 돌지 않는 마을의 개수를 구하는 프로그램을 작성하시오.
 
# ( 1 ≤ N, K ≤ 100,000 )
 
# 10 3
# 3*2 = 6 , 3/3 = 1
# 6/3 = 2
# 2*2 = 4
# 4*2 = 8
 
# 1, 2, 3, 4, 6, 8 
def bfs(start):
  global visited
  deq = deque()
  deq.append(start)
  visited[start] = start
  
  while len(deq) > 0:
    cur = deq.popleft()
    
    oper1 = cur * 2
    oper2 = cur // 3
    
    if oper1 > 0 and oper1 <= n and visited[oper1] == 0:
      visited[oper1] = oper1
      deq.append(oper1)
    if oper2 > 0 and oper2 <= n and visited[oper2] == 0:
      visited[oper2] = oper2
      deq.append(oper2)
  
 
if __name__ == "__main__":
  n, m = map(int, sys.stdin.readline().split())
  visited = [0]*(n+1)
  bfs(m) 
  cnt = 0
  for i in range(1len(visited)):
    if visited[i] == 0:
      cnt += 1
  print(cnt)
cs

 

# bfs 복습

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import sys
from collections import deque
 
def BFS():
  
  global N, K
  
  visited = [False]*(N+1)
  visited[0]=True
  deq     = deque( )
  deq.append(K)
  visited[K]=True
  
  while deq:
    x2=deq.popleft()
    
    myVal=x2*2 
    if 1<=myVal<=and not visited[myVal]:
      visited[myVal]=True
      deq.append(myVal)
      
    myVal=x2//3
    if 1<=myVal<=and not visited[myVal]:
      visited[myVal]=True
      deq.append(myVal)
      
  cnt=0
  for i in visited:
    if not i:
      cnt+=1
      
  print(cnt) 
  
 
if __name__ == "__main__":
  input=sys.stdin.readline
  
  N, K = map(int, input().split())
  
  if N==1:
    print(1)
  else:
    BFS()
cs

 

반응형

'CS > 알고리즘_문제풀이(파이썬)' 카테고리의 다른 글

2색칠하기(DFS/BFS)  (0) 2021.06.06
목수의 미로 탈출  (0) 2021.06.05
미로 찾기  (0) 2021.06.05
단지 번호 붙이기(dfs, bfs)[백준 2667]  (0) 2021.06.04
웜 바이러스[백준 2606]  (0) 2021.06.03