์•Œ๊ณ ๋ฆฌ์ฆ˜/๊ทธ๋ž˜ํ”„

[softeer level 3] 7์ฐจ ์ •๊ธฐ ์ง„๋‹จ ํ‰๊ฐ€ - ์ˆœ์„œ๋Œ€๋กœ ๋ฐฉ๋ฌธํ•˜๊ธฐ

1eehyunji 2023. 8. 26. 01:21

https://softeer.ai/practice/info.do?idx=1&eid=2050 

 

Softeer

์—ฐ์Šต๋ฌธ์ œ๋ฅผ ๋‹ด์„ Set์„ ์„ ํƒํ•ด์ฃผ์„ธ์š”. ์ทจ์†Œ ํ™•์ธ

softeer.ai

๋ฌธ์ œ

Sam์€ ํŒ€์žฅ๋‹˜์œผ๋กœ๋ถ€ํ„ฐ ์ฐจ๋Ÿ‰์ด ์ด๋™ ๊ฐ€๋Šฅํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค์˜ ์ˆ˜๋ฅผ ์ฐพ์œผ๋ผ๋Š” ์—…๋ฌด ์ง€์‹œ๋ฅผ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. ์ด๋™์€ ์ˆซ์ž 0๊ณผ 1๋กœ๋งŒ ์ด๋ฃจ์–ด์ ธ ์žˆ๋Š” n x n ํฌ๊ธฐ์˜ ๊ฒฉ์ž ์œ„์—์„œ ์ผ์–ด๋‚ฉ๋‹ˆ๋‹ค. ์ˆซ์ž 0์€ ๋นˆ ์นธ์„ ์˜๋ฏธํ•˜๋ฉฐ, ์ˆซ์ž 1์€ ํ•ด๋‹น ์นธ์ด ๋ฒฝ์œผ๋กœ ๋ง‰ํ˜€ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜๋Š” n์ด 3์ธ ๊ฒฝ์šฐ์˜ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.

 

0 0 0
0 0 0
0 0 1

 

์ฐจ๋Ÿ‰์€ n x n ๊ฒฉ์ž ๋‚ด์—์„œ m๊ฐœ์˜ ์ง€์ ์„ ์ˆœ์„œ๋Œ€๋กœ ๋ฐฉ๋ฌธํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋•Œ ์ด๋™์€ ํ•ญ์ƒ ์ƒํ•˜์ขŒ์šฐ ์ค‘ ์ธ์ ‘ํ•œ ์นธ์œผ๋กœ๋งŒ ์ด๋™ํ•˜๋˜ ๋ฒฝ์€ ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์—†์œผ๋ฉฐ, ํ•œ ๋ฒˆ ์ง€๋‚ฌ๋˜ ์ง€์ ์€ ๋‹ค์‹œ๋Š” ๋ฐฉ๋ฌธํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์กฐ๊ฑด ํ•˜์—์„œ ์ฐจ๋Ÿ‰์ด ์ด๋™ ๊ฐ€๋Šฅํ•œ ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ€์ง€ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•ด๋ณด์„ธ์š”.

 

๋ฐฉ๋ฌธํ•ด์•ผ ํ•˜๋Š” ์ง€์ ์˜ ์ฒซ ์ง€์ ์ด ์ถœ๋ฐœ์ ์ด๋ฉฐ, ๋งˆ์ง€๋ง‰ ์ง€์ ์ด ๋„์ฐฉ์ ์ž„์— ์œ ์˜ํ•ฉ๋‹ˆ๋‹ค.

 

์œ„์˜ ์˜ˆ์—์„œ m = 3, ๋ฐฉ๋ฌธํ•ด์•ผ ํ•˜๋Š” ์ง€์ ์ด ์ˆœ์„œ๋Œ€๋กœ (3ํ–‰, 1์—ด), (1ํ–‰, 2์—ด), (2ํ–‰, 3์—ด)์ด๋ผ๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™์ด 5๊ฐ€์ง€์˜ ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

 

1. (3ํ–‰, 1์—ด) → (3ํ–‰, 2์—ด) → (2ํ–‰, 2์—ด)  (1ํ–‰, 2์—ด) → (1ํ–‰, 3์—ด)  (2ํ–‰, 3์—ด)

 

2. (3ํ–‰, 1์—ด) → (3ํ–‰, 2์—ด) → (2ํ–‰, 2์—ด) → (2ํ–‰, 1์—ด) → (1ํ–‰, 1์—ด)  (1ํ–‰, 2์—ด) → (1ํ–‰, 3์—ด)  (2ํ–‰, 3์—ด)

 

3. (3ํ–‰, 1์—ด) → (2ํ–‰, 1์—ด) → (2ํ–‰, 2์—ด)  (1ํ–‰, 2์—ด) → (1ํ–‰, 3์—ด)  (2ํ–‰, 3์—ด)

 

4. (3ํ–‰, 1์—ด) → (2ํ–‰, 1์—ด) → (1ํ–‰, 1์—ด)  (1ํ–‰, 2์—ด) → (1ํ–‰, 3์—ด)  (2ํ–‰, 3์—ด)

 

5. (3ํ–‰, 1์—ด) → (2ํ–‰, 1์—ด) → (1ํ–‰, 1์—ด)  (1ํ–‰, 2์—ด) → (2ํ–‰, 2์—ด)  (2ํ–‰, 3์—ด)

 

์ œ์•ฝ ์กฐ๊ฑด

[์กฐ๊ฑด 1] 2 ≤ n ≤ 4

[์กฐ๊ฑด 2] 2 ≤ m ≤ n2

์ž…๋ ฅ ํ˜•์‹

์ฒซ ๋ฒˆ์งธ ์ค„์—๋Š” ๊ฒฉ์ž์˜ ํฌ๊ธฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” n๊ณผ ์ˆœ์„œ๋Œ€๋กœ ๋ฐฉ๋ฌธํ•ด์•ผ ํ•˜๋Š” ์นธ์˜ ์ˆ˜ m์ด ๊ณต๋ฐฑ์„ ์‚ฌ์ด์— ๋‘๊ณ  ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค.

 

๋‘ ๋ฒˆ์งธ ์ค„๋ถ€ํ„ฐ๋Š” n๊ฐœ์˜ ์ค„์— ๊ฑธ์ณ ๊ฐ ํ–‰์— ํ•ด๋‹นํ•˜๋Š” n๊ฐœ์˜ ์ˆ˜๊ฐ€ ๊ณต๋ฐฑ์„ ์‚ฌ์ด์— ๋‘๊ณ  ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค. ์ฃผ์–ด์ง€๋Š” ์ˆ˜๋Š” 0 ๋˜๋Š” 1์ด๋ฉฐ, 0์€ ๋นˆ ์นธ์„ 1์€ ๋ฒฝ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

 

n + 2 ๋ฒˆ์งธ ์ค„๋ถ€ํ„ฐ๋Š” m๊ฐœ์˜ ์ค„์— ๋ฐฉ๋ฌธํ•ด์•ผ ํ•  m๊ฐœ์˜ ์นธ์˜ ์œ„์น˜ (x, y) ์Œ์ด ๊ณต๋ฐฑ์„ ์‚ฌ์ด์— ๋‘๊ณ  ํ•œ ์ค„์— ํ•˜๋‚˜์”ฉ ์ˆœ์„œ๋Œ€๋กœ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค. ์ฃผ์–ด์ง€๋Š” ์นธ์— ๋ฒฝ์ด ์žˆ๋Š” ๊ฒฝ์šฐ๋Š” ์—†์œผ๋ฉฐ, ๋™์ผํ•œ ์นธ์ด ์—ฌ๋Ÿฌ ๋ฒˆ ์ฃผ์–ด์ง€๋Š” ๊ฒฝ์šฐ๋Š” ์—†๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋„ ์ข‹์Šต๋‹ˆ๋‹ค.

์ถœ๋ ฅ ํ˜•์‹

์ฐจ๋Ÿ‰์ด m๊ฐœ์˜ ์ง€์ ์„ ์ˆœ์„œ๋Œ€๋กœ ๋ฐฉ๋ฌธํ•  ์ˆ˜ ์žˆ๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์˜ ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๊ฐ€๋Šฅํ•œ ๋ฐฉ๋ฒ•์ด ์—†๋‹ค๋ฉด 0์„ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

์ž…๋ ฅ ์˜ˆ์ œ1

3 3
0 0 0
0 0 0
0 0 1
3 1
1 2
2 3

์ถœ๋ ฅ ์˜ˆ์ œ1

5

์ž…๋ ฅ ์˜ˆ์ œ2

3 3
0 0 1
0 0 0
0 0 1
3 1
1 2
2 3

์ถœ๋ ฅ ์˜ˆ์ œ2

1

๋ฌธ์ œ ํ’€์ด

์ด ๋ฌธ์ œ๋Š” ์ง„๋‹จํ‰๊ฐ€์—์„  BFS๋กœ ํ’€์ด๋ฅผ ์ œ์ถœํ–ˆ๋Š”๋ฐ ์•Œ๊ณ  ํŠœํ„ฐ๋‹˜ ํ’€์ด๋ฅผ ๋ณด๋‹ˆ DFS๋กœ ํ‘ธ์…จ๊ธธ๋ž˜ ์ฒจ๋ถ€ํ•ด๋ณธ๋‹ค!

dfs๋ฅผ ํƒ์ƒ‰ํ•˜๋ฉด์„œ dfs ์žฌ๊ท€๋ฅผ ๋‹ค ๋Œ๊ณ ๋‚˜๋ฉด ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌํ•œ ์œ„์น˜๋Š” ๋‹ค์‹œ visited[][]=0์œผ๋กœ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๊ฒƒ์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์ค˜์•ผ ์ •์ƒ์ ์œผ๋กœ ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ๋‹ค!

import sys

n,m=map(int, sys.stdin.readline().split(' '))
area=[[0]+list(map(int,sys.stdin.readline().strip().split(' '))) for _ in range(n)]
area.insert(0,[0]*(n+1))
visited=[[0]*(n+1) for _ in range(n+1)]
dest=[]

for i in range(1,m+1):
    y,x=map(int, sys.stdin.readline().strip().split(' '))
    dest.append((y,x))

directions=[(0,1),(1,0),(0,-1),(-1,0)]
ans=0

def dfs(y,x,level):
    global ans
    if (y,x)==dest[level]:
        if level==m-1:
            ans+=1
            return
        else:
            level+=1
    visited[y][x] = 1
    for di in directions:
        dy=y+di[0]
        dx=x+di[1]
        if 1<=dy<=n and 1<=dx<=n and visited[dy][dx]==0 and area[dy][dx]==0:
            dfs(dy,dx,level)
    visited[y][x] = 0

dfs(dest[0][0], dest[0][1], 1)

print(ans)

๋‹ค์Œ์€ ๋‚ด๊ฐ€ ํ‘ผ BFS ๋ฌธ์ œ ํ’€์ด์ด๋‹ค.

import sys
from collections import deque

n,m=map(int, sys.stdin.readline().split(' '))

area=[[0]+list(map(int,sys.stdin.readline().strip().split(' '))) for _ in range(n)]
area.insert(0,[0]*(n+1))
visited=[[0]*(n+1) for _ in range(n+1)]
dest=[]

for i in range(1,m+1):
    y,x=map(int, sys.stdin.readline().strip().split(' '))
    dest.append((y,x))

directions=[(0,1),(1,0),(0,-1),(-1,0)]
ans=0

queue=deque()
visited[dest[0][0]][dest[0][1]]=1
queue.append((dest[0][0],dest[0][1],1,visited))
while queue:
    cury, curx, level, visited = queue.popleft()
    if cury==dest[level][0] and curx==dest[level][1]:
        if level==m-1:
            ans+=1
            continue
        else:
            level+=1
    for di in directions:
        dy=cury+di[0]
        dx=curx+di[1]
        if 1<=dy<=n and 1<=dx<=n and visited[dy][dx]==0 and area[dy][dx]==0:
            new_visited = [arr[:] for arr in visited]
            new_visited[dy][dx]=1
            queue.append((dy,dx,level,new_visited))


print(ans)

๋Œ€์‹  DFS ํ’€์ด์™€ ๋‹ฌ๋ฆฌ, ๋งค๋ฒˆ ํ๋งˆ๋‹ค ๋ฐฉ๋ฌธ ๊ฒฝ๋กœ๊ฐ€ ์ €์žฅ๋œ new_visited ๋ฐฐ์—ด์„ ๋„ฃ์–ด์ค˜์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— n ๊ฐ’์ด ํฌ๋‹ค๋ฉด ๋ฉ”๋ชจ๋ฆฌ ์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•  ํ™•๋ฅ ์ด ๋†’๊ธฐ ๋•Œ๋ฌธ์— DFS ํ’€์ด๊ฐ€ ํ›จ์”ฌ ๋” ์ข‹์€ ํ’€์ด์ธ ๊ฒƒ ๊ฐ™๋‹ค!

 

DFS ํ’€์ด์˜ ๊ฒฝ์šฐ ์˜ˆ์ œ 1๋ฒˆ์„ ๊ธฐ์ค€์œผ๋กœ ๊ฐ„๋žตํ•˜๊ฒŒ ํ๋ฆ„์„ ๊ทธ๋ ค๋ดค๋Š”๋ฐ ๋ธ”๋กœ๊ทธ์— ํฌ์ŠคํŒ… ๋ชฉ์ ์œผ๋กœ ๊ทธ๋ฆฐ ๊ฑด ์•„๋‹ˆ๋ผ์„œ ์•Œ์•„๋ณด๊ธฐ ํž˜๋“ค ์ˆ˜ ์žˆ์ง€๋งŒ ํ˜น์‹œ ๋„์›€์ด ๋ ๊นŒํ•ด์„œ ์˜ฌ๋ ค๋ณธ๋‹ค..!