반응형
밑의 링크는 CodeUp에서의 문제 링크입니다.
주의해야 할 점
개미는 다음 경로가 벽일 때까지 오른쪽으로만 움직입니다.
다음 경로가 벽이라면 밑으로 움직였다가 다시 오른쪽이 벽이 아니라면 계속 오른쪽으로 움직입니다.
그래서 일반적인 미로 문제보다 훨씬 쉬운 문제입니다.
문제를 제대로 읽지 않았다면 이 부분을 놓치고 어떻게 풀어야 할지 감이 안 올 수도 있습니다.
생각한 풀이 과정
- 10x10 미로를 2차원 리스트로 만들고 한 가로줄마다 미로의 구조를 반복문으로 입력합니다.
- 가로줄마다 미로의 구조를 입력할 때, 현재 가로줄에서 먹이가 있다면, 먹이의 좌표값을 따로 변수 feed_x, feed_y를 만들어 넣어줍니다.
- 개미의 현재 위치 좌표를 저장하는 변수 cur_x, cur_y를 선언합니다. 개미는 인덱스 값 (1, 1) 좌표부터 이동하므로 cur_x, cur_y에 각각 1로 초기화합니다.
- 계속 반복하는 반복문을 만들어줍니다.
- 개미의 현재 위치에서의 값을 저장하는 cur_num을 선언합니다.
- 개미의 현재 위치는 개미가 이동한 곳이므로 현재 위치의 값을 9로 변경합니다.
- 현재 개미의 위치가 먹이의 위치였거나, 개미가 맨 아래의 가장 오른쪽에 도착했거나, 개미가 다음으로 이동할 경로인 오른쪽이나 밑이 모두 벽이라 더 이상 움직일 수 없다면, 반복문을 탈출합니다.
- 현재 개미의 위치에서 오른쪽이 벽이라면, 오른쪽으로 이동할 수 없으므로 밑으로 이동합니다.
- 그렇지 않다면 개미는 오른쪽으로 이동합니다.
- 반복문을 탈출할 때까지 과정 5 ~ 과정 9를 반복합니다.
- 반복문이 끝나고 난 뒤, 개미가 이동한 경로를 9로 표시한 미로를 출력합니다.
제출한 파이썬 코드
# readline을 사용하기 위해 import합니다.
from sys import stdin
# 10x10 크기의 미로 상자를 만들기 위한 10칸짜리 리스트를 선언합니다.
maze = [None] * 10
# 먹이의 x, y좌표를 저장할 변수를 선언합니다.
feed_x, feed_y = None, None
# 미로 상자의 구조와 먹이의 위치를 입력합니다.
# 10x10 크기에서 가로줄이 10개이므로 10번 반복합니다.
for idx in range(10):
# 한 가로줄의 미로 구조를 공백으로 구분해 입력합니다.
# 각각 정수형으로 변환하고 리스트로 만들어줍니다.
# maze의 현재 인덱스에 리스트를 넣어줍니다.
maze[idx] = list(map(int, stdin.readline().split()))
# 이번에 입력한 가로줄에서 먹이값인 2가 있다면
if 2 in maze[idx]:
# 먹이의 x, y좌표값을 변수에 저장해줍니다.
feed_x = idx
feed_y = maze[idx].index(2)
# 현재 개미의 위치를 저장하는 변수들을 선언합니다.
# 미로 상자의 테두리는 모두 벽으로 되어 있으므로
# 개미가 출발하는 좌표는 인덱스 값으로 (1, 1)에서 시작합니다.
# 문제에서는 인덱스값 기준이 아니라 (2, 2)로 표시되어 있습니다.
cur_x, cur_y = 1, 1
# 계속 반복해봅니다.
while True:
# 현재 개미 위치에서의 값을 저장하는 변수를 선언합니다.
cur_num = maze[cur_x][cur_y]
# 개미가 이동한 경로이므로 현재 위치의 값을 9로 변경합니다.
maze[cur_x][cur_y] = 9
# 현재 개미의 위치가 먹이의 위치였거나,
# 개미가 맨 아래의 가장 오른쪽에 도착했거나,
# 현재 개미의 위치에서 오른쪽과 밑이 모두 벽이라 더 이상 움직일 수 없다면
if cur_num == 2 or (cur_x, cur_y) == (9, 9) or (maze[cur_x+1][cur_y] == 1 and maze[cur_x][cur_y+1] == 1):
# 반복문을 탈출합니다.
break
# 현재 개미의 위치에서 오른쪽이 벽이라면
if maze[cur_x][cur_y+1] == 1:
# 개미는 밑으로 이동합니다.
cur_x += 1
# 그렇지 않다면
else:
# 개미는 오른쪽으로 이동합니다.
cur_y += 1
# 반복문이 끝나고 난 뒤 개미가 이동한 경로를 9로 표시한 미로를 출력합니다.
for i in range(10):
for j in range(10):
# 미로에서 한 가로줄의 상황을 공백으로 구분해 출력합니다.
print(maze[i][j], end=' ')
# 한 가로줄의 상황이 모두 출력되면 다음 가로줄의 상황을 출력하기 위해 다음 줄로 넘어갑니다.
print()
제출 결과
느낀 점
일반적인 미로 문제는 BFS, DFS를 사용하는 문제인, 입문자, 초보자에게는 어려운 난이도에 속하는 문제입니다.
저는 아직 그 경지까지 제대로 공부하지 못했기 때문에
문제에서 미로라는 단어를 보고 한껏 긴장했습니다.
근데 개미가 이동하는 조건이 달려 있어 다행히도 BFS나 DFS를 활용하지 않고 풀 수 있는 문제였습니다.
기초 100제인데 갑자기 BFS나 DFS가 나오는 것도 이상하지만요... 😅😅
이 문제를 마지막으로 CodeUp 기초100제 파이썬 버전이 끝났습니다.
정확히는 98문제이지만 여기가 끝 문제입니다.
뭔가 되게 오랫동안 붙잡은 느낌입니다.
더 어려운 것에도 계속 도전해나가야 하는데 복습만 하는 느낌에 약간 죄책감이 들었습니다만,
정작 다 하고 나니 보람차네요.
이제 새로운 공부들도 더 해나가고, 무작정 알고리즘 문제만 풀지 말고 개발도 열심히 해야겠습니다.
※ 궁금한 부분, 이상한 점 및 오타는 댓글에 부탁드립니다.
※ 더 효율적이고 빠른 정답을 환영합니다.
반응형
댓글