본문 바로가기

[Code Up] 기초 알고리즘 100제 With Python

6098 : [기초-리스트] 성실한 개미(py)

예제


영일이는 생명과학에 관심이 생겨 왕개미를 연구하고 있었다.

왕개미를 유심히 살펴보던 중 특별히 성실해 보이는 개미가 있었는데,
그 개미는 개미굴에서 나와 먹이까지 가장 빠른 길로 이동하는 것이었다.

개미는 오른쪽으로 움직이다가 벽을 만나면 아래쪽으로 움직여 가장 빠른 길로 움직였다.
(오른쪽에 길이 나타나면 다시 오른쪽으로 움직인다.)

이에 호기심이 생긴 영일이는 그 개미를 미로 상자에 넣고 살펴보기 시작하였다.

미로 상자에 넣은 개미는 먹이를 찾았거나, 더 이상 움직일 수 없을 때까지
오른쪽 또는 아래쪽으로만 움직였다.

미로 상자의 구조가 0(갈 수 있는 곳), 1(벽 또는 장애물)로 주어지고,
먹이가 2로 주어질 때, 성실한 개미의 이동 경로를 예상해보자.

단, 맨 아래의 가장 오른쪽에 도착한 경우, 더 이상 움직일 수 없는 경우, 먹이를 찾은 경우에는
더이상 이동하지 않고 그 곳에 머무른다고 가정한다.

미로 상자의 테두리는 모두 벽으로 되어 있으며,
개미집은 반드시 (2, 2)에 존재하기 때문에 개미는 (2, 2)에서 출발한다.

[입력]
10*10 크기의 미로 상자의 구조와 먹이의 위치가 입력된다.

[출력]
성실한 개미가 이동한 경로를 9로 표시해 출력한다.

해설

  • 개미는 오른쪽으로 이동할 수 있을 때까지 이동하며, 벽을 만날 시 아래로 이동한다.
  • 개미는 아래로 이동하다가 오른쪽에 벽이 사라져 이동할 수 있다면, 다시 오른쪽으로 이동한다.
  • 코드를 작성할 때 헷갈리지 않도록 10 * 10 개미 판이 아닌 11 * 11 개미 판을 생성 후, 가로 0번째 줄, 세로 0번째 줄은 생략하고 출력하는 코드를 작성하자.
  • 사용자가 입력한 개미 판을 리스트로 저장할 때는 꼭 int형으로 바꾸어 저장해야 한다.
    • 1 != '1' 즉, 정수형 1과 문자형 1은 같은 값이 아니기 때문에 추후 if 문에서 오류가 생긴다.
  • 개미가 개미 판을 넘어가기 전까지 이동을 반복해야 하므로 while x < 10 and y < 10 조건을 걸어준다.
  • 오른쪽과 아래 모두 벽이 존재하거나 먹이를 찾는다면 루프를 나오는 if 문을 작성한다.

소스 코드

# 11 * 11 개미 판 만들기
board = []
for i in range(11):
    board.append([])
    for j in range(11):
        board[i].append(0)

# 개미 판 입력받기
for i in range(10):
    array = input().split() # 문자 타입을 저장하는 배열 ['0', '0', ... ]
    for j in range(10):
        board[i + 1][j + 1] = int(array[j]) # 꼭 정수로 변환해서 리스트에 저장하기!

# 개미의 시작점이자 위치 (x는 세로. y는 가로)
x = 2; y = 2;

# 먹이를 찾아 움직이는 개미
while x < 10 and y < 10: # 개미 판을 넘어가기 전까지 반복
    board[x][y] = 9 # 시작
    if board[x][y+1] == 1: # 오른쪽으로 이동할 때 벽을 만난다면
        if board[x+1][y] == 1: # 아래로 이동할 때 벽을 만난다면
            break # 반복 탈출
        else: # 아래로 이동할 수 있다면
            x += 1 # 아래로 한 칸 내려가는데
            if board[x][y] == 2: # 먹이를 발견했다면
                board[x][y] = 9; # 그 위치를 9로 바꾸고
                break # 반복 탈출
    else: # 오른쪽으로 이동할 수 있다면
        y += 1 # 오른쪽으로 한 칸 이동했는데
        if board[x][y] == 2:  # 먹이를 발견했다면
            board[x][y] = 9 # 그 위치를 9로 바꾸고
            break # 반복 탈출

# 개미 판 출력
for i in range(1, 11):
    for j in range(1, 11):
        print(board[i][j], end=' ')
    print()