728x90
이번 포스트에서는 Python Challenge의 Level 24 문제에 대해 다루겠다.
문제를 클릭하면 다음과 같은 페이지가 출력된다.
## 문제 해석 :
미로 사진이 출력되어 있다. 우선 해당 미로의 시작과 끝을 찾은 다음에 미로를 풀면 되는 것으로 보인다.
## 문제 풀이 :
우선 파이썬을 통해 미로의 시작점과 끝점을 알아내보겠다.
### 공격 코드 :
from PIL import Image
maze = Image.open("maze.png")
w, h = maze.size
for i in range(w): # Top line
print(maze.getpixel((i, 0)))
print("================= Top, Bottom 구별 선 =================")
for i in range(h): # Bottom line
print(maze.getpixel((i, h-1)))
### 실행 결과 :
출력 결과를 확인해보면 (255, 255, 255, 255)가 벽으로 보이며, 시작점이 (w - 2, 0), 끝점이 (1, h - 1)인 것을 알 수 있다.
이어서 해당 미로를 풀어야 하는데, 여기서는 너비 우선 탐색(BFS) 알고리즘을 활용해보겠다. 너비 우선 탐색 알고리즘에 관한 설명은 아래 포스트에 확인할 수 있다.
### 공격 코드 :
from PIL import Image
maze = Image.open("maze.png")
directions = [(0, 1), (0, -1), (1, 0), (-1, 0)] # 상하좌우
wall = (255, 255, 255, 255)
w, h = maze.size
next_step = {}
ent = (w-2, 0) # 시작점
exit = (1, h-1) # 끝점
queue = [exit]
while queue:
pos = queue.pop(0)
if pos == ent:
break
for d in directions:
tmp = (pos[0] + d[0], pos[1] + d[1])
# 경로 탐색
if not tmp in next_step and 0 <= tmp[0] < w and 0 <= tmp[1] < h and maze.getpixel(tmp) != wall:
next_step[tmp] = pos
queue.append(tmp)
path = []
while pos != exit:
path.append(maze.getpixel(pos)[0])
pos = next_step[pos]
print(path[1::2])
open("maze.zip", "wb").write(bytes(path[1::2])) # zip파일 출력
### 실행 결과 :
경로를 탐색하다 보면 픽셀, 즉 non-wall의 값은 (x, 0, 0, 255)로 이루어져 있다. 또한 해당 값이 PK(zip의 헤더)로 시작된다. zip파일을 출력하고 압축해제하면 lake라는 단어가 적힌 사진을 볼 수 있다.
### 최종 공격문 : http://www.pythonchallenge.com/pc/hex/lake.html
### 실행 결과 :
Level 25로 넘어간 것을 확인할 수 있다.
'Wargame > Python Challenge' 카테고리의 다른 글
Python Challenge (Level 23) (1) | 2022.09.22 |
---|---|
Python Challenge (Level 22) (0) | 2022.09.21 |
Python Challenge (Level 21) (1) | 2022.09.20 |
Python Challenge (Level 20) (1) | 2022.09.19 |
Python Challenge (Level 19) (0) | 2022.09.18 |