๋ฏธ๋ก์ฐพ๊ธฐ
๊ทธ๋ฆผ๊ณผ ๊ฐ์ด wall ๊ณผ pathway๋ก ๊ตฌ์ฑ๋ ๋ฏธ๋ก๋ฅผ ํ์ถํ๋ ์ฝ๋๋ฅผ recursion์ผ๋ก ๊ตฌํํ ์ ์๋ค.
recursiveํ๊ฒ ์๊ฐ์ ํด์ผํ๋ค.
ํ์ฌ ์์น์์ ์ถ๊ตฌ๊น์ง ๊ฐ๋ ๊ฒฝ๋ก๊ฐ ์์ผ๋ ค๋ฉด
- ํ์ฌ ์์น๊ฐ ์ถ๊ตฌ๊ฑฐ๋
- ์ด์ํ ์ ๋ค ์ค ํ๋์์ ์ถ๊ตฌ๊น์ง ๊ฐ๋ ๊ฒฝ๋ก๊ฐ ์๊ฑฐ๋
๊ฐ๋จํ๊ฒ ์๊ฐํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๊ตฌํํ ์ ์๋ค.
boolean findPath(x,y)
if (x,y) is the exit
return true;
else
for each neighbouring cell (x',y') of (x,y) do
if (x',y') is a pathway cell
if findPath(x',y')
return true
return false;
(x,y)์์ ์ถ๊ตฌ๊น์ง ๊ฒฝ๋ก๊ฐ ์์ผ๋ฉด true, ์์ผ๋ฉด false๋ฅผ returnํ๋ ํจ์์ด๋ค.
(x,y)์ ์ด์ํ ์
๋ค์ ๋ฐ๋ณต๋ฌธ์ผ๋ก ๋์๊ฐ๋ฉฐ ์
์ด wall์ด ์๋ pathway์ด๋ผ๋ฉด, ์ฌ๊ท์ ์ผ๋ก ๊ทธ ์์น์์ ๊ฒฝ๋ก๊ฐ ์๋์ง findPathํจ์๋ฅผ ํธ์ถํ๋ค.
ํ์ง๋ง ์ฌ๊ธฐ์๋ ๋ฌธ์ ์ ์ด ์๋ค. ๋ฐ๋ก ๋ฌดํ๋ฃจํ์ ๋น ์ง ์ ๋ ์๋ค๋ ๊ฒ์ด๋ค. ๋ง์ฝ findPath(x',y')์์ ๋ค์ ์๋ ์์น์ธ (x,y)๋ก ์ด๋ํ๋ค๋ฉด ๋ฌดํ๋ฃจํ์ ๋น ์ง ๊ฒ์ด๋ค. ์ด์๊ฐ์ด ์ฌ๊ทํจ์๋ฅผ ์ฌ์ฉ ํ ๋๋ ๋ฌดํ๋ฃจํ๋น ์ง๊ธฐ ์ฌ์ผ๋ฏ๋ก ์ฃผ์ํด์ผ ํ๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ด ์๊ฐํด ๋ณผ ์ ์๋ค.
- ํ์ฌ์์น๊ฐ ์ถ๊ตฌ์ด๊ฑฐ๋.
- ์ด์ํ ์ ๋ค ์ค ํ๋์์ ์ด๋ฏธ ๊ฐ๋ณธ ๊ณณ์ ๋ค์ ์ง๋์ง ์๊ณ ์ถ๊ตฌ๊น์ง ๊ฐ๋ ๊ฒฝ๋ก๊ฐ ์๊ฑฐ๋.
์ด๋ฅผ ์ฝ๋๋ก ๊ตฌํํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค
boolean findPath(x,y)
if (x,y) is wall or (x,y) is a visited Cell
return false;
else if (x,y) is the exit
return true;
else
mark (x,y) as visited cell;
for each neighbouring cell (x',y') of (x,y) do
if findPath(x',y')
return true;
return false
ํจ์ ์ ์ผ ์ฒ์์ (x,y)๊ฐ ๋ฒฝ์ด๊ฑฐ๋ ์ด๋ฏธ ๋ฐฉ๋ฌธํ ์
์ด๋ฉด false๋ฅผ ๋ฆฌํดํ๋๋ก ์ฝ๋๋ฅผ ์ถ๊ฐํ์๊ณ ,
๋ฐ๋ณต๋ฌธ์ ๋๋ฉฐ ์ด์ํ ์
์ ์ด๋ํ ๋ ํ์ฌ ์์น (x,y)๋ฅผ visited cell๋ก ํ์๋ฅผ ํ๊ณ ์ง๋๊ฐ๋๋ก ํ์๋ค.
์ ์ฒด์ฝ๋๋ฅผ ๊ตฌํํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
N=8
maze=[
[0,0,0,0,0,0,0,1],
[0,1,1,0,1,1,0,1],
[0,0,0,1,0,0,0,1],
[0,1,0,0,1,1,0,0],
[0,1,1,1,0,0,1,1],
[0,1,0,0,0,1,0,1],
[0,0,0,1,0,0,0,1],
[0,1,1,1,0,1,0,0]
]
pathwayColor=0
wallColor=1
blockedColor=2
pathColor=3
def findMazePath(x,y):
if x<0 or y<0 or x>=N or y>=N or maze[x][y]!=pathwayColor:
return False
elif x==N-1 and y==N-1:
maze[x][y]=pathColor
return True
else:
maze[x][y]=pathColor
if findMazePath(x-1,y) or findMazePath(x,y+1) or findMazePath(x+1,y) or findMazePath(x,y-1):
return True
maze[x][y]=blockedColor
return False
for i in maze:
print(i)
print(findMazePath(0,0))
for i in maze:
print(i)
[0, 0, 0, 0, 0, 0, 0, 1]
[0, 1, 1, 0, 1, 1, 0, 1]
[0, 0, 0, 1, 0, 0, 0, 1]
[0, 1, 0, 0, 1, 1, 0, 0]
[0, 1, 1, 1, 0, 0, 1, 1]
[0, 1, 0, 0, 0, 1, 0, 1]
[0, 0, 0, 1, 0, 0, 0, 1]
[0, 1, 1, 1, 0, 1, 0, 0]
True
[3, 2, 2, 2, 2, 2, 2, 1]
[3, 1, 1, 2, 1, 1, 2, 1]
[3, 2, 2, 1, 2, 2, 2, 1]
[3, 1, 2, 2, 1, 1, 2, 2]
[3, 1, 1, 1, 2, 2, 1, 1]
[3, 1, 3, 3, 3, 1, 2, 1]
[3, 3, 3, 1, 3, 3, 3, 1]
[0, 1, 1, 1, 0, 1, 3, 3]
[3, 2, 2, 2, 2, 2, 2, 1]
[3, 1, 1, 2, 1, 1, 2, 1]
[3, 2, 2, 1, 2, 2, 2, 1]
[3, 1, 2, 2, 1, 1, 2, 2]
[3, 1, 1, 1, 2, 2, 1, 1]
[3, 1, 3, 3, 3, 1, 2, 1]
[3, 3, 3, 1, 3, 3, 3, 1]
[0, 1, 1, 1, 0, 1, 3, 3]
3๋ฒ์ผ๋ก ํ์๋ ๋ถ๋ถ์ด ๊ฒฝ๋ก์ด๋ค.
'๐์ฝ๋ฉํ ์คํธ:CodingTest' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์๊ณ ๋ฆฌ์ฆ]์ต๋ ๊ณต์ฝ์(GCD) ์๊ณ ๋ฆฌ์ฆ - ์ ํด๋ฆฌ๋ ํธ์ ๋ฒ (0) | 2023.06.19 |
---|---|
[์๊ณ ๋ฆฌ์ฆ]๋ณํฉ ์ ๋ ฌ(Merge Sort) (0) | 2023.06.19 |
์นด์ดํ ์ ๋ ฌ(Counting Sort)Permalink (0) | 2023.06.19 |
[์๊ณ ๋ฆฌ์ฆ]์๊ฐ๋ณต์ก๋ (0) | 2023.06.19 |
[์๊ณ ๋ฆฌ์ฆ]Recursion ๊ฐ๋ (0) | 2023.05.03 |