Skip to content

Commit d7f8418

Browse files
authored
Merge pull request #57 from zaqquum/main
Hongjoo/ 8월5주차 /2개
2 parents ff8f33e + 145b556 commit d7f8418

File tree

2 files changed

+146
-0
lines changed

2 files changed

+146
-0
lines changed

Hongjoo/lv3/블록이동하기.py

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
"""
2+
"""
3+
from collections import deque
4+
def solution(board):
5+
N = len(board)
6+
#방향벡터 - "좌","상",하,우, (row, column) = (y,x)
7+
# 상하좌우
8+
dx = [-1,0,1,0]
9+
dy = [0,1,0,-1]
10+
answer = 0
11+
12+
#외벽 생성 & (idx : 1~N)
13+
nboard = [[1] * (N+2) for _ in range(N+2)]
14+
for i in range(N):
15+
for j in range(N) :
16+
nboard[i+1][j+1] = board[i][j]
17+
18+
#위치 : (y,x, 로봇 방향, 이동횟수)
19+
# 위치값 기준 -행, 열이 더 큰값으로 변경
20+
queue = deque([(1,1),(1,2), 0]) # BFS : L, R , 거리
21+
visited = set([(1,1),(1,2)]) # 방문 여부 -> L,R 둘다
22+
print("#",visited,queue)
23+
while queue :
24+
s1,s2, dis = queue.popleft() # L,R,현거리
25+
# NxN목적지 도착
26+
if s1 == (N,N) or s2 == (N,N):
27+
return dis
28+
tmp = [] # 가능한 경우의 수
29+
# 상하좌우 방향으로 이동
30+
for d in range(4) : # [L2,R1]
31+
s1_r = s1[0] + dx[d]
32+
s1_c = s1[1] + dx[d]
33+
s2_r = s2[0] + dx[d]
34+
s2_c = s2[1] + dx[d]
35+
if nboard[s1_r][s1_c] == 0 and nboard[s1_r][s1_c] :
36+
tmp.append( ((s1_r,s1_c),(s2_r,s2_c)) ) # new position
37+
#가로 -> 세로
38+
if s1[0] == s2[0] : # 가로
39+
# 위로 회전 or 아래로 회전
40+
# s2 : NN과 가장 가까운 점
41+
for i in [1,-1] :
42+
if nboard[s1[0]+i][s1[1]] == 0 and nboard[s2[0]+i][s2[1]] == 0:
43+
tmp.append( (s1, (s1[0] + i, s1[1]) )) # s1중심
44+
tmp.append( (s2, (s2[0] + i ,s2[1]) )) # s2 중심
45+
else : # 세로 -> 가로
46+
#오른쪽 회전 , 왼쪽 회전
47+
for i in [1,-1] :
48+
if nboard[s1[0],s2[0]+i] == 0 and nboard[s1[0],s2[0]+i] == 0:
49+
tmp.append(((s1[0],s1[1]+i), s1))
50+
tmp.append(((s2[0] ,s2[1] +i) ,s2))
51+
52+
for pset in tmp : # 이웃한 좌표들 중
53+
if pset not in visited : #없으면
54+
queue.append((pset , dis+1))
55+
visited.add(pset)
56+
57+
d

Hongjoo/백준/연구소.py

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
2+
3+
"""
4+
5+
(1) 벽 3개 - 세우기 -> 0중 3 개 조합 구하기
6+
(2) BFS -> 확산시키기
7+
(3) 안전 영역 계산하기 -> min 이란 비교시 업데이트
8+
(4) 조합 replay
9+
10+
#bfs
11+
visited = [False] * 9
12+
def bfs(graph, start, visited):
13+
# start -> queue, visited
14+
queue = deque([start])
15+
visited[start] = True
16+
while queue :
17+
node= queue.popleft()
18+
for i in graph[node]:
19+
if not visited[i]:
20+
queue.append(i)
21+
visited[i] = True
22+
23+
24+
"""
25+
from itertools import combinations
26+
from collections import deque
27+
import sys
28+
import copy
29+
30+
a,b= map(int, sys.stdin.readline().split()) # row, columns
31+
32+
m = []
33+
zero_p = []
34+
virus_p = []
35+
for i in range(a):
36+
tmp = list(map(int, input().split()))
37+
for j in range(b) :
38+
if tmp[j] == 0:
39+
zero_p.append([i,j])
40+
elif tmp[j] == 2 :
41+
virus_p.append([i,j])
42+
m.append(tmp)
43+
# print(m)
44+
#1. zero_p 중 3개 조합 구하기 -> combi
45+
combi = list(combinations(zero_p , 3))
46+
47+
#2. BFS
48+
max_safe= 0
49+
for walls in combi:
50+
graph=copy.deepcopy(m)
51+
# 벽설치
52+
for w_x, w_y in walls :
53+
graph[w_x][w_y] = 1
54+
55+
new_v_count =0
56+
# virus 들위 위치 = BFS start 위치
57+
for v in range(len(virus_p)) :
58+
start=virus_p[v] # start = [x,y]
59+
queue = deque([start])
60+
#bfs
61+
while queue :
62+
node = queue.popleft()
63+
# print("#",node, end ="")
64+
# 인근 node - 상/하/좌/우
65+
near_node = [[node[0]+1,node[1]] ,
66+
[node[0]-1,node[1]],
67+
[node[0],node[1]+1],
68+
[node[0],node[1]-1] ]
69+
70+
for nn in near_node :
71+
x,y = nn
72+
# out of range
73+
if x < 0 or x >= a or y <0 or y>=b :
74+
# print("bump!")
75+
continue
76+
# print(x,y)
77+
if graph[x][y] == 0 : #방문 x
78+
queue.append(nn)
79+
graph[x][y] = 2 # 방문 완료
80+
new_v_count+= 1
81+
82+
83+
#(3) 안전 영역 계산하기 -> min 이란 비교시 업데이트
84+
safe_area = len(zero_p)-3 -new_v_count
85+
if max_safe < safe_area :
86+
max_safe = safe_area
87+
print(f"{max_safe}")
88+
89+

0 commit comments

Comments
 (0)