Skip to content

Commit 19e363b

Browse files
authored
Merge pull request #110 from zaqquum/main
Hongjoo/ 12์›” 3์ฃผ์ฐจ /2 ๋ฌธ์ œ
2 parents 12fdf40 + ad967cd commit 19e363b

File tree

3 files changed

+134
-1
lines changed

3 files changed

+134
-1
lines changed
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
from collections import deque
2+
import sys
3+
"""
4+
1. ์ดˆ๊ธฐํ™”
5+
- R,B ์˜ ์œ„์น˜ ์ขŒํ‘œ
6+
- ๋ฐฉ๋ฌธ ๋“ฑ๋ก
7+
2. queue
8+
3. 4๋ฐฉ์œ„
9+
-> ํŒŒ๋ž€ ๊ตฌ์ˆ  ๊ตฌ๋ฉ -> ์‹คํŒจ
10+
-> ๋นจ๊ฐ„ ๊ตฌ์ˆ  ๊ตฌ๋ฉ -> ์„ฑ๊ณต
11+
-> ๋‘˜์ด ๊ฐ™์€ ์œ„์น˜=>
12+
"""
13+
14+
n, m = map(int, sys.stdin.readline().split())
15+
board = [list(input().rstrip()) for _ in range(n)]
16+
visited = []
17+
18+
# ์šฐ,์ขŒ,ํ•˜,์ƒ
19+
dx = [1 ,-1 , 0 ,0]
20+
dy = [0,0,-1,1]
21+
22+
def get_RB_position(): # Red , Blue
23+
rx ,ry, bx , by = 0 , 0, 0, 0
24+
for i in range(n):
25+
for j in range(m):
26+
if board[i][j] == "R" :
27+
rx , ry = i, j
28+
elif board[i][j] == "B":
29+
bx , by = i , j
30+
31+
return rx ,ry, bx , by
32+
33+
def move(x,y, dx , dy) :
34+
# ๋ฒฝ ๋˜๋Š” ๊ตฌ๋ฉ๊นŒ์ง€ ์ด๋™
35+
# dx ,dy : ๋ฐฉํ–ฅ
36+
shift_cnt = 0
37+
while board[x + dx][y+dy] != "#" and board[x][y] != "O":
38+
x += dx
39+
y+= dy
40+
shift_cnt +=1
41+
42+
return x ,y, shift_cnt
43+
44+
45+
def bfs() :
46+
#1. ์ดˆ๊ธฐํ™”
47+
rx , ry , bx , by = get_RB_position()
48+
queue = deque()
49+
queue.append((rx,ry, bx , by, 1)) # red ์ขŒํ‘œ , blue ์ขŒํ‘œ , ํšŸ์ˆ˜
50+
visited.append((rx,ry , bx,by))
51+
52+
while queue :
53+
rx,ry,bx,by,result= queue.popleft()
54+
# 10ํšŒ ์ดˆ๊ณผํ•ด๋„ ์•ˆ๋‚˜์˜ค๋ฉด -1 ๋ฐ˜ํ™˜
55+
if result > 10 :
56+
57+
break
58+
59+
for i in range(4): #
60+
crx , cry , r_shift = move(rx ,ry , dx[i], dy[i])
61+
cbx , cby , b_shift = move(bx ,by, dx[i], dy[i])
62+
63+
# ๋งŒ์•ฝ ํŒŒ๋ž€๊ณต์ด ๊ตฌ๋ฉ์— ๋“ค์–ด๊ฐ€๋ฉด ์‹คํŒจ
64+
if board[cbx][cby] == "O" :
65+
continue
66+
# ๋งŒ์•ฝ ๋นจ๊ฐ„ ๊ณต์ด ๊ตฌ๋ฉ์— ๋“ค์–ด๊ฐ€๋ฉด ์„ฑ๊ณต
67+
if board[crx][cry] == "O" :
68+
print(result)
69+
return 0
70+
# ๋งŒ์•ฝ ๋‘ ๊ณต์ด ๊ฒน์น˜๋ฉด -> ๋” ๋งŽ์ด ์ด๋™ํ•œ ๊ณต์ด ๋” ์ „์— ์žˆ์Œ
71+
if cbx == crx and cry == cby :
72+
if r_shift > b_shift : # red ๊ฐ€ ๋” ๋ฉ€๋ฆฌ ์žˆ์Œ
73+
crx -=dx[i]
74+
cry -= dy[i]
75+
else :
76+
cbx -=dx[i]
77+
cby -= dy[i]
78+
# ์ฒ˜์Œ ๋„์ฐฉํ•œ ์นธ์ธ ๊ฒฝ์šฐ
79+
if (crx , cry , cbx, cby) not in visited :
80+
visited.append((crx , cry , cbx, cby))
81+
queue.append((crx , cry , cbx, cby , result +1))
82+
print(-1)
83+
84+
bfs()
85+
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import sys
2+
from collections import deque
3+
# 1. ์ž…๋ ฅ ๊ทธ๋ž˜ํ”„
4+
N , M = map(int,sys.stdin.readline().split())
5+
graph = []
6+
for n in range(N) :
7+
graph.append(list(map(int, input())))
8+
9+
#๋ฐฉ๋ฌธ ์—ฌ๋ถ€ & ์‹œ์ž‘๋…ธ๋“œ๋กœ ๋ถ€ํ„ฐ ์ตœ๋‹จ ๊ฒฝ๋กœ ๊ฑฐ๋ฆฌ ,๋ฒฝ ๋ถ€์ˆœ ํšŸ์ˆ˜(3์ฐจ์›)
10+
visited = [[[0]*2 for _ in range(M)] for k in range(N)]
11+
12+
#์ƒํ•˜์ขŒ์šฐ -> ์ธ์ ‘ ๋…ธ๋“œ
13+
dx = [0,0,1,-1]
14+
dy = [1,-1,0,0]
15+
16+
# 2. bfs ์ตœ๋‹จ ๊ฑฐ๋ฆฌ
17+
def bfs():
18+
#์ดˆ๊ธฐ ๋…ธ๋“œ queue ์— ์ถ”๊ฐ€ , ๋ฐฉ๋ฌธ ๋“ฑ๋ก
19+
dq = deque()
20+
dq.append((0,0,0))
21+
visited[0][0][0] = 1
22+
23+
while dq :
24+
x,y,wall = dq.popleft()
25+
# ๋ชฉ์ ์ง€(N,M) ๋„์ฐฉํ•œ ๊ฒฝ์šฐ,์ด๋™ ํšŸ์ˆ˜ ์ถœ๋ ฅ
26+
if x == N-1 and y == M -1 :
27+
return visited[x][y][wall]
28+
29+
for i in range(4):#์ƒํ•˜์ขŒ์šฐ๋กœ ๋‹ค์Œ ์ด๋™ํ•  ์นธ์˜ ์œ„์น˜
30+
xx = x+ dx[i] ; yy = y+ dy[i]
31+
# (1)๋‹ค์Œ ์ด๋™ํ•  ๊ณณ์ด graph ๋ฐ–์— ์žˆ๋Š” ๊ฒฝ์šฐ
32+
if xx<0 or xx>= N or yy <0 or yy>= M:
33+
continue
34+
# (2) ๋‹ค์Œ ์ด๋™ํ•  ๊ณณ์ด ๋ฒฝ์ด๊ณ , ํ•œ๋ฒˆ๋„ ๋ฒฝ ์•ˆ ๋šค์—ˆ์„๋•Œ
35+
if graph[xx][yy] == 1 and wall == 0 : # and not visited[xx][yy][1]
36+
visited[xx][yy][1] = visited[x][y][0]+1
37+
dq.append((xx,yy,1))
38+
39+
#(3)๋‹ค์Œ ์ด๋™ํ•  ๊ณณ์ด ๋ฒฝ์ด ์•„๋‹ˆ๊ณ ,ํ•œ๋ฒˆ๋„ ๋ฐฉ๋ฌธ ํ•˜์ง€ ์•Š์€ ๊ณณ
40+
elif graph[xx][yy] == 0 and visited[xx][yy][wall] == 0 : # ๊ทธ๋ƒฅ ๊ฐ
41+
visited[xx][yy][wall] = visited[x][y][wall] +1
42+
dq.append((xx,yy,wall))
43+
44+
return -1 #BFS ์ข…๋ฃŒ๋ ๋–„ ๊นŒ์ง€ ๋„์ฐฉ์ ์— ๋„๋‹ฌํ•˜์ง€ ๋ชปํ•˜๋ฉด -1 ์ถœ๋ ฅํ•˜๊ธฐ
45+
46+
print(bfs())
47+
48+

โ€Ž_WeeklyChallenges/W04-[BFS]/README.mdโ€Ž

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
## ๐Ÿš€ 12์›” 3์ฃผ์ฐจ (12/21) ์Šคํ„ฐ๋”” ๋ฐœ์ œ ์ฃผ์ œ: BFS
1+
## ๐Ÿš€ 12์›” 3์ฃผ์ฐจ (12/16) ์Šคํ„ฐ๋”” ๋ฐœ์ œ ์ฃผ์ œ: BFS
22
> ๋ฐœ์ œ์ž: ๊น€ํ™์ฃผ
33
44
### ๐Ÿ—‚๏ธ ์Šคํ„ฐ๋”” ์ž๋ฃŒ

0 commit comments

Comments
ย (0)