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

[๋ฐฑ์ค€ 1525 ๐Ÿฅ‡] ํผ์ฆ

1eehyunji 2023. 8. 28. 01:07

๋ฌธ์ œ

3×3 ํ‘œ์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜๊ฐ€ ์ฑ„์›Œ์ ธ ์žˆ๋‹ค. ์˜ค๋ฅธ์ชฝ ์•„๋ž˜ ๊ฐ€์žฅ ๋ ์นธ์€ ๋น„์–ด ์žˆ๋Š” ์นธ์ด๋‹ค.

1 2 3
4 5 6
7 8  

์–ด๋–ค ์ˆ˜์™€ ์ธ์ ‘ํ•ด ์žˆ๋Š” ๋„ค ๊ฐœ์˜ ์นธ ์ค‘์— ํ•˜๋‚˜๊ฐ€ ๋น„์–ด ์žˆ์œผ๋ฉด, ์ˆ˜๋ฅผ ๊ทธ ์นธ์œผ๋กœ ์ด๋™์‹œํ‚ฌ ์ˆ˜๊ฐ€ ์žˆ๋‹ค. ๋ฌผ๋ก  ํ‘œ ๋ฐ”๊นฅ์œผ๋กœ ๋‚˜๊ฐ€๋Š” ๊ฒฝ์šฐ๋Š” ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ์šฐ๋ฆฌ์˜ ๋ชฉํ‘œ๋Š” ์ดˆ๊ธฐ ์ƒํƒœ๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์ตœ์†Œ์˜ ์ด๋™์œผ๋กœ ์œ„์™€ ๊ฐ™์€ ์ •๋ฆฌ๋œ ์ƒํƒœ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋‹ค. ๋‹ค์Œ์˜ ์˜ˆ๋ฅผ ๋ณด์ž.

1   3
4 2 5
7 8 6
1 2 3
4   5
7 8 6
1 2 3
4 5  
7 8 6
1 2 3
4 5 6
7 8  

๊ฐ€์žฅ ์œ— ์ƒํƒœ์—์„œ ์„ธ ๋ฒˆ์˜ ์ด๋™์„ ํ†ตํ•ด ์ •๋ฆฌ๋œ ์ƒํƒœ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ์ด์™€ ๊ฐ™์ด ์ตœ์†Œ ์ด๋™ ํšŸ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ž…๋ ฅ

์„ธ ์ค„์— ๊ฑธ์ณ์„œ ํ‘œ์— ์ฑ„์›Œ์ ธ ์žˆ๋Š” ์•„ํ™‰ ๊ฐœ์˜ ์ˆ˜๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ํ•œ ์ค„์— ์„ธ ๊ฐœ์˜ ์ˆ˜๊ฐ€ ์ฃผ์–ด์ง€๋ฉฐ, ๋นˆ ์นธ์€ 0์œผ๋กœ ๋‚˜ํƒ€๋‚ธ๋‹ค.

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ์ตœ์†Œ์˜ ์ด๋™ ํšŸ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ์ด๋™์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ -1์„ ์ถœ๋ ฅํ•œ๋‹ค.

๋ฌธ์ œ ํ’€์ด

import sys
from collections import deque

target=[['1','2','3'],['4','5','6'],['7','8','0']]
numbers=[list(sys.stdin.readline().strip().split(' ')) for _ in range(3)]

ans=1e9

# DFS๋Š” ๋ชจ๋“  ๊ฒฝ๋กœ๋ฅผ ํƒ์ƒ‰ํ•ด์•ผ ํ•ด์„œ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๋ณด์žฅํ•˜๋Š” BFS๋กœ ํ’€์–ด์•ผ ํ•จ.
# def dfs(blank,count):
#     global ans, numbers
#     if numbers==target:
#         ans=min(ans, count)
#         return
#     for di in directions:
#         by=blank[0]+di[0]
#         bx=blank[1]+di[1]
#         if 0<=by<3 and 0<=bx<3:
#             numbers[blank[0]][blank[1]]=numbers[by][bx]
#             numbers[by][bx]=0
#             dfs((by,bx),count+1)
#             numbers[by][bx]=numbers[blank[0]][blank[1]]
#             numbers[blank[0]][blank[1]]=0

visited=set()
def bfs(blank, count, numbers):
    global ans
    queue=deque()
    queue.append((blank[0], blank[1], count, numbers))
    directions = [(0, 1), (1, 0), (-1, 0), (0, -1)]
    while queue:
        blank_y,blank_x,c,num=queue.popleft()
        if num==target:
            ans=c
            return
        for di in directions:
            by=blank_y+di[0]
            bx=blank_x+di[1]
            if 0<=by<3 and 0<=bx<3:
                new_numbers = [arr[:] for arr in num]
                new_numbers[blank_y][blank_x] = new_numbers[by][bx]
                new_numbers[by][bx]='0'
                str_new_number=''.join(sum(new_numbers,[]))
                if str_new_number not in visited:
                    queue.append((by,bx,c+1, new_numbers))
                    visited.add(str_new_number)

for i in range(3):
    for j in range(3):
        if numbers[i][j]=='0':
            visited.add(''.join(sum(numbers,[])))
            bfs((i,j),0, numbers)
            if ans!=1e9:
                print(ans)
            else:
                print(-1)
            sys.exit(0)
  • ์ฒ˜์Œ์—” DFS๋ฅผ ์ด์šฉํ•ด์„œ ์›€์ง์ด๋Š” ์ขŒํ‘œ๋ณ„๋กœ visited ๋ฐฐ์—ด์„ ๋งค ํ๋งˆ๋‹ค ๋„ฃ์–ด์ค„ ํ•„์š”์—†์ด visited๋ฅผ ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌํ•ด์คฌ๋‹ค๊ฐ€ ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ œํ•ด์คฌ๋‹ค๊ฐ€ ํ•˜๋ฉด์„œ DFS ํƒ์ƒ‰์„ ์ด์šฉํ•ด์„œ ๊ตฌํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ•ด์„œ DFS๋กœ ํ’€์—ˆ๋”๋‹ˆ ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.
  • numbers ๋ฐฐ์—ด๊ณผ target ๋ฐฐ์—ด์ด ์ผ์น˜ํ•˜๋”๋ผ๋„ ์ตœ์†Œ๊ฐ€ ๋ณด์žฅ๋˜์ง€ ์•Š๋Š” DFS ํŠน์„ฑ์ƒ ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ํƒ์ƒ‰ํ•˜๊ณ  ๊ทธ ์ค‘ ๊ฐ€์žฅ ์ž‘์€ count ๊ฐ’์„ ๊ตฌํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ฌธ์ œ์—์„œ DFS๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ์—” ๋ฌด๋ฆฌ๊ฐ€ ์žˆ๋‹ค.
  • ๊ทธ๋ž˜์„œ BFS๋กœ ๋ณ€๊ฒฝํ•ด์„œ ํ’€์—ˆ๋‹ค! ๋Œ€์‹  ๊ฐ ๊ฒฝ๋กœ๋งˆ๋‹ค ์ƒˆ๋กœ์šด visited ๋ฐฐ์—ด์„ ํ์— ๋„ฃ์–ด์ฃผ๋ฉด์„œ ํ’€์–ด์•ผ ํ•œ๋‹ค. ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๊ฐ€ ํฌ๋‹ค๋ฉด ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์ง€๋งŒ, ์ด ๋ฌธ์ œ์˜ ๊ฒฝ์šฐ 3x3 ๋ฐฐ์—ด๋กœ ๊ณ ์ •๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋Šฅํ•˜๋‹ค. 
  • ๊ทธ๋ฆฌ๊ณ  BFS๋ฅผ ๋Œ๋ฉด์„œ ๋ฐฉ๋ฌธํ–ˆ๋˜ ํ‘œ ์ƒํƒœ์ธ์ง€ ํ™•์ธํ•˜๊ณ , ๋ฐฉ๋ฌธํ•œ ๊ฒฝ์šฐ์ด๋ฉด ํ์— ๋„ฃ์–ด์ฃผ์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค. ์ด ๋ถ€๋ถ„์—์„œ ํ•ด๋‹น ํ‘œ ์ƒํƒœ๋ฅผ ์ง€๋‚˜๊ฐ”์—ˆ๋Š”์ง€๋Š” set๊ณผ ๋ฌธ์ž์—ด์„ ์ด์šฉํ•ด์„œ ๊ตฌํ˜„ํ–ˆ๋‹ค.
  • set์€ in ์—ฐ์‚ฐ์ž๊ฐ€ ์ƒ์ˆ˜ ์‹œ๊ฐ„์ด๋ฏ€๋กœ visited set ์•ˆ์— ๋ฐฉ๋ฌธํ–ˆ๋‹ค๊ณ  ์ €์žฅ๋œ ๋ฌธ์ž์—ด์ธ์ง€ ํ™•์ธํ•˜๊ธฐ์— ์šฉ์ดํ•˜๋‹ค.
  • numbers=[['1','0','3'],['2','5','6'],['4','7','8']]์ด๋ผ๋Š” ํ‘œ ์ƒํƒœ๊ฐ€ ์žˆ๋‹ค๋ฉด sum(numbers, [])๋ฅผ ํ•˜๋ฉด ['1','0','3','2','5','6','4','7','8']๋กœ ๋ณ€๊ฒฝ์ด ๋œ๋‹ค. ์ด๋ ‡๊ฒŒ ๋ณ€๊ฒฝ๋œ ๋ฐฐ์—ด์€ ''.join(sum(numbers, []))์œผ๋กœ '103256478'๋กœ ๋ณ€๊ฒฝ์ด ๋˜๊ณ , ์ด๋ฅผ visited set์— ๋„ฃ์–ด์ค˜์„œ ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ค€๋‹ค. 
  • ์ด๋Ÿฌํ•œ ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ์ง€ ์•Š์œผ๋ฉด target ๋ฐฐ์—ด์ธ [[1,2,3],[4,5,6],[7,8,0]]์„ ๊ตฌํ•˜๋ฉด return๋˜๋Š” BFS์˜ while ์ข…๋ฃŒ ์กฐ๊ฑด์„ ๊ตฌํ•  ์ˆ˜๊ฐ€ ์—†์–ด์„œ ๋ฌดํ•œ ๋ฃจํ”„๋ฅผ ๋Œ๊ฒŒ ๋˜๋ฏ€๋กœ ๊ผญ! ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ค˜์•ผ ํ•œ๋‹ค.