Skip to content

Commit 386434c

Browse files
authored
승연 책 숙제(6/1/화) (#80)
* 특정 거리의 도시 찾기 * 연구소 * 경쟁적 전염 * 경쟁적 전염 fix * 경쟁적 전염 fix * Delete 17179.py
1 parent fd954ab commit 386434c

File tree

3 files changed

+162
-0
lines changed

3 files changed

+162
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
#CH13 BFSDFS기출
2+
#예제 13-15
3+
#특정거리의 도시찾기
4+
#백준 18352
5+
#실버 2
6+
7+
from collections import deque
8+
import sys
9+
input = sys.stdin.readline
10+
11+
N,M,K,X = map(int,input().split())
12+
13+
edges = [[] for _ in range(N+1)]
14+
visited = [False for _ in range(N+1)]
15+
#간선 정보 입력 받기
16+
for i in range(M):
17+
a,b = map(int,input().split())
18+
edges[a].append(b)
19+
20+
def bfs():
21+
answer = []
22+
q = deque([])
23+
q.append((X,0)) #현재노드, 이동 거리
24+
visited[X]=True
25+
while q:
26+
node, cnt = q.popleft()
27+
if cnt==K:
28+
answer.append(node)
29+
for next in edges[node]:
30+
if not visited[next]:
31+
q.append((next,cnt+1))
32+
visited[next]=True
33+
return answer
34+
35+
result = bfs()
36+
result.sort()
37+
if len(result)==0:
38+
print(-1)
39+
else:
40+
for res in result:
41+
print(res)

‎syheo/codingTest1/13-16-연구소.py

+73
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
#CH13 BFSDFS기출
2+
#예제 13-16
3+
#연구소
4+
#백준 14502
5+
#골드 5
6+
7+
import itertools
8+
from collections import deque
9+
10+
N , M = map(int,input().split())
11+
dx = [0,0,1,-1]
12+
dy = [1,-1,0,0]
13+
maps = []
14+
virus = []
15+
empties = []
16+
wall = 0
17+
whole_visited = [[False]*M for _ in range(N)]
18+
19+
for i in range(N):
20+
tmp = list(map(int,input().split()))
21+
for j in range(M):
22+
if tmp[j]==2:
23+
virus.append((i,j))
24+
elif tmp[j]==0:
25+
empties.append((i,j))
26+
maps.append(tmp)
27+
28+
wall = N*M-len(virus)-len(empties)
29+
30+
def bfs():
31+
32+
visited = [[False]*M for _ in range(N)]
33+
q = deque([])
34+
#바이러스 모두 출발 시키기
35+
for i in range(len(virus)):
36+
a,b = virus[i]
37+
q.append((a,b))
38+
visited[a][b] = True
39+
whole_visited[a][b] = True
40+
while q:
41+
v = q.popleft()
42+
for i in range(4):
43+
r = v[0]+dx[i]
44+
c = v[1]+dy[i]
45+
if 0<=r<N and 0<=c<M and not visited[r][c] and maps[r][c]!=1:
46+
q.append((r,c))
47+
visited[r][c]=True
48+
whole_visited[r][c] = True
49+
50+
answer = 0
51+
52+
cases = itertools.permutations(empties,3)
53+
54+
for case in cases:
55+
for a,b in case:
56+
maps[a][b]=1
57+
whole_visited = [[False]*M for _ in range(N)]
58+
cnt = 0
59+
60+
bfs()
61+
62+
#빈 공간 구하기
63+
for i in range(N):
64+
for j in range(M):
65+
if not whole_visited[i][j]:
66+
cnt+=1
67+
68+
answer = max(cnt-wall-3,answer)
69+
70+
for a,b in case:
71+
maps[a][b]=0
72+
73+
print(answer)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
#CH13 BFSDFS기출
2+
#예제 13-17
3+
#경쟁적 전염
4+
#백준 18405
5+
#실버 1
6+
7+
from collections import deque
8+
9+
N , K = map(int,input().split())
10+
maps = [[(0,0)]*(N+1) for i in range(N+1)] #백신 번호, cnt(초)
11+
dx = [0,0,1,-1]
12+
dy = [1,-1,0,0]
13+
virus = []
14+
15+
16+
for i in range(N):
17+
tmp = list(map(int,input().split()))
18+
maps[i][0]=(0,0)
19+
for j in range(N):
20+
maps[i+1][j+1]=(tmp[j],0)
21+
if tmp[j]>=1:
22+
virus.append((i+1,j+1,0)) #virus 좌표, cnt(초)
23+
24+
S,X,Y = map(int,input().split())
25+
26+
def bfs():
27+
q = deque(virus)
28+
while q:
29+
#print(q)
30+
row,col,cnt = q.popleft()
31+
if cnt == S:
32+
break
33+
for i in range(4):
34+
r = row + dx[i]
35+
c = col + dy[i]
36+
if 0<r<=N and 0<c<=N:
37+
#해당 장소에 바이러스가 없으면?
38+
if maps[r][c][0] == 0:
39+
maps[r][c]=(maps[row][col][0],cnt+1)
40+
q.append((r,c,cnt+1))
41+
#같은 시간대에 먼저 간 바이러슨데 ��가 나보다 우선순위가 낮다면?
42+
elif maps[r][c][0] > maps[row][col][0] and maps[r][c][1] == cnt+1:
43+
maps[r][c]=(maps[row][col][0],cnt+1)
44+
q.append((r,c,cnt+1))
45+
46+
bfs()
47+
print(maps[X][Y][0])
48+

0 commit comments

Comments
 (0)