๐Ÿ“‚์ฝ”๋”ฉํ…Œ์ŠคํŠธ:CodingTest

[์•Œ๊ณ ๋ฆฌ์ฆ˜]Recursion ์‘์šฉ(๋ฏธ๋กœ์ฐพ๊ธฐ)

mc.thd 2023. 6. 19. 15:13

๋ฏธ๋กœ์ฐพ๊ธฐ

๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด 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๋ฒˆ์œผ๋กœ ํ‘œ์‹œ๋œ ๋ถ€๋ถ„์ด ๊ฒฝ๋กœ์ด๋‹ค.