📋 문제 설명
미로 상자의 구조가 0(갈 수 있는 곳), 1(벽 또는 장애물)로 주어지고,
먹이가 2로 주어질 때, 성실한 개미의 이동 경로를 예상해보자.
단, 맨 아래의 가장 오른쪽에 도착한 경우, 더 이상 움직일 수 없는 경우, 먹이를 찾은 경우에는
더 이상 이동하지 않고 그곳에 머무른다고 가정한다.
미로 상자의 테두리는 모두 벽으로 되어 있으며,
개미집은 반드시 (2, 2)에 존재하기 때문에 개미는 (2, 2)에서 출발한다.
⌨️ 입력
10*10 크기의 미로 상자의 구조와 먹이의 위치가 입력된다.
🖥️ 출력
성실한 개미가 이동한 경로를 9로 표시해 출력한다.
📸 입력 예시
1 1 1 1 1 1 1 1 1 1
1 0 0 1 0 0 0 0 0 1
1 0 0 1 1 1 0 0 0 1
1 0 0 0 0 0 0 1 0 1
1 0 0 0 0 0 0 1 0 1
1 0 0 0 0 1 0 1 0 1
1 0 0 0 0 1 2 1 0 1
1 0 0 0 0 1 0 0 0 1
1 0 0 0 0 0 0 0 0 1
1 1 1 1 1 1 1 1 1 1
🖼️ 출력 예시
1 1 1 1 1 1 1 1 1 1
1 9 9 1 0 0 0 0 0 1
1 0 9 1 1 1 0 0 0 1
1 0 9 9 9 9 9 1 0 1
1 0 0 0 0 0 9 1 0 1
1 0 0 0 0 1 9 1 0 1
1 0 0 0 0 1 9 1 0 1
1 0 0 0 0 1 0 0 0 1
1 0 0 0 0 0 0 0 0 1
1 1 1 1 1 1 1 1 1 1
✏️ 풀이과정
maze = [[0 for i in range(10)] for i in range(10)] #미로 상자 리스트
ant_x, ant_y = 1, 1 #개미가 출발할 인덱스 값
for i in range(10):
maze[i] = input().split()
for j in range(10):
maze[i][j] = int(maze[i][j]) #미로 상자 안 값을 입력받고, int형으로 변환
while True:
if maze[ant_x][ant_y] == 0: # 현재 개미가 위치해 있는 곳이 0이라면 9로 값을 바꿈
maze[ant_x][ant_y] = 9
elif maze[ant_x][ant_y] == 2: #개미가 위치해 있는 곳이 2라면 9로 바꾸고 break
maze[ant_x][ant_y] = 9
break
if (ant_x == 9 or ant_y == 9) or (maze[ant_x+1][ant_y] == 1 and maze[ant_x][ant_y+1]) == 1:
break #미로 상자의 끝에 도달했거나, 오른쪽과 아래가 1로 막혀 이동이 불가하면 break
if maze[ant_x][ant_y+1] != 1: #한 칸 오른쪽이 1이 아니라면 오른쪽으로 이동
ant_y += 1
elif maze[ant_x+1][ant_y] != 1: #한 칸 아래가 1이 아니라면 아래로 이동
ant_x += 1
for i in range(10):
for j in range(10):
print(maze[i][j], end = " ")
print()
이 문제는 마지막 문제 답게 가장 오래 걸렸던 문제였다.
일단,
- 개미는 오른쪽 혹은 아래로만 움직인다.
- 개미는 먹이를 먹는 것보다 오른쪽과 아래로만 움직이는 것이 우선순위이다.
이런 조건들이 있어 어려웠고, 1로 구성된 벽을 어떻게 검사할지 고민을 많이 하게 하는 문제였다.
while True로 무한 반복을 시켜 특정 조건에 부합하면 break로 빠져나오게 했는데,
코드의 오류로 무한 반복에 빠지기도 했다.
또한, 모든 조건에서 한 칸 옆 또는 한 칸 아래를 먼저 검사하도록 했을 때에는 개미가 오른쪽으로 가야 함에도, 먹이가 감지되어 문제를 틀리기도 했다. (4번째 테스트 케이스)
시행착오도 많이 겪고, 눈도 아팠던 문제였던 것 같다.
'Programming Language > PYTHON' 카테고리의 다른 글
[C언어] Pcap을 이용한 TCP 프로토콜 정보 출력 프로그램 (2) | 2023.10.09 |
---|---|
[빡공팟 5기] 6097 : [기초-리스트] 설탕과자 뽑기(py) (0) | 2022.09.28 |
[빡공팟 5기] | 코드업 | 6096 : [기초-리스트] 바둑알 십자 뒤집기(py) (1) | 2022.09.25 |
[빡공팟 5기] | 코드업 | 6095 : [기초-리스트] 바둑판에 흰 돌 놓기(설명)(py) (1) | 2022.09.23 |
[빡공팟 5기] | 코드업 | 6088 : [기초-종합] 수 나열하기1(py) (1) | 2022.09.22 |