본문 바로가기
알고리즘/CodeUp PS

[CodeUp][Python 기초 100제] 6098번 : [기초-리스트] 성실한 개미

by 빛밤하늘 2021. 8. 8.
반응형

밑의 링크는 CodeUp에서의 문제 링크입니다.

 

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

python언어기초100제v1.0 : @컴퓨터과학사랑, 전국 정보(컴퓨터)교사 커뮤니티/연구회 - 학교 정보(컴퓨터)선생님들과 함께 수업/방과후학습/동아리활동 등을 통해 재미있게 배워보세요. - 모든 내용

codeup.kr

 

 

 

 

 

 

 

 

주의해야 할 점

개미는 다음 경로가 벽일 때까지 오른쪽으로만 움직입니다.

다음 경로가 벽이라면 밑으로 움직였다가 다시 오른쪽이 벽이 아니라면 계속 오른쪽으로 움직입니다.

그래서 일반적인 미로 문제보다 훨씬 쉬운 문제입니다.

 

문제를 제대로 읽지 않았다면 이 부분을 놓치고 어떻게 풀어야 할지 감이 안 올 수도 있습니다.

 

 

 

생각한 풀이 과정

  1. 10x10 미로를 2차원 리스트로 만들고 한 가로줄마다 미로의 구조를 반복문으로 입력합니다.
  2. 가로줄마다 미로의 구조를 입력할 때, 현재 가로줄에서 먹이가 있다면, 먹이의 좌표값을 따로 변수 feed_x, feed_y를 만들어 넣어줍니다.
  3. 개미의 현재 위치 좌표를 저장하는 변수 cur_x, cur_y를 선언합니다. 개미는 인덱스 값 (1, 1) 좌표부터 이동하므로 cur_x, cur_y에 각각 1로 초기화합니다.
  4. 계속 반복하는 반복문을 만들어줍니다.
  5. 개미의 현재 위치에서의 값을 저장하는 cur_num을 선언합니다.
  6. 개미의 현재 위치는 개미가 이동한 곳이므로 현재 위치의 값을 9로 변경합니다.
  7. 현재 개미의 위치가 먹이의 위치였거나, 개미가 맨 아래의 가장 오른쪽에 도착했거나, 개미가 다음으로 이동할 경로인 오른쪽이나 밑이 모두 벽이라 더 이상 움직일 수 없다면, 반복문을 탈출합니다.
  8. 현재 개미의 위치에서 오른쪽이 벽이라면, 오른쪽으로 이동할 수 없으므로 밑으로 이동합니다.
  9. 그렇지 않다면 개미는 오른쪽으로 이동합니다.
  10. 반복문을 탈출할 때까지 과정 5 ~ 과정 9를 반복합니다.
  11. 반복문이 끝나고 난 뒤, 개미가 이동한 경로를 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문제이지만 여기가 끝 문제입니다.

 

뭔가 되게 오랫동안 붙잡은 느낌입니다.

더 어려운 것에도 계속 도전해나가야 하는데 복습만 하는 느낌에 약간 죄책감이 들었습니다만,

정작 다 하고 나니 보람차네요.

이제 새로운 공부들도 더 해나가고, 무작정 알고리즘 문제만 풀지 말고 개발도 열심히 해야겠습니다.

 

 

 

※ 궁금한 부분, 이상한 점 및 오타는 댓글에 부탁드립니다.

※ 더 효율적이고 빠른 정답을 환영합니다.

반응형

댓글