공부/CodeUp

[CodeUp] 성실한 개미

silver_ye 2021. 10. 12. 21:03

 

Q) 성실한 개미 문제


성실한 개미 문제


 

💡 문제의 포인트

1️⃣ 개미집은 (2,2)에 위치함으로 개미는 (2,2)에서 출발한다.

2️⃣ 개미는 0일 때, 오른쪽으로 움직으로 움직이고 벽(1)을 만나면 아래로 움직인다.

3️⃣ 개미가 움직이 않을 때,

     1) 맨 아래의 가장 오른쪽에 도착한 경우

     2) 더 이상 움직일 수 없는 경우

     3) 먹이(2)를 찾은 경우

 


A) 성실한 개미 내 답변

## 1) 미로 상자의 구조 리스트
lst = [] # 먼저, 빈 리스트를 생성
for i in range(10): # 10*10의 크기임으로 10번 입력됨
    a = input().split() # split으로 리스트에 넣기
    a = list(map(int,a)) # int형으로 변환하여 리스트에 넣기
    lst.append(a) # 빈 리스트에 append를 통해 추가하여 10*10 완성

## 2) 개미 경로 찾기
# i = 아래로 이동, j = 오른쪽 이동 으로 지정했다.
# 개미의 경로는 막히지 않는 이상 오른쪽으로만 이동하게 된다.
# 그럼으로 오른쪽은 고정되어있으면서 아래로 이동해야하기에 num을 지정하여, 아래로 내려가기전 부분부터
# 진행되도록 하였다.

num = 1 # 개미의 집은 (2,2)지만 인덱스로는 [1][1]임으로 1로 지정
breaks = False # 이중 for문으로 첫번째 for문의 break 설정을 위해 breaks 변수를 지정, 
               # True = 첫번째 for문 break

# 아래로 이동 for문 (첫번째 for문)
for i in range(1,10):
    if breaks == True: # 이중 for문 멈추기
        break

    # 오른쪽 이동 for문(두번째 for문)
    for j in range(num, 10): # num을 받아와 아래로 내려온 부분부터 시작

        ## 2-1) 먹이를 찾을 경우, breaks를 지정하여 이중 for문 멈추기
        if lst[i][j] == 2:
            lst[i][j] = 9 # 9로 경로 표시
            breaks = True
            break

        ## 2-2) 벽(1)이 없음으로, 오른쪽으로 이동
        elif lst[i][j] == 0:
            lst[i][j] = 9 # 9로 경로 표시
            
        ## 2-3) 벽(1)이 있음으로, 아래로 이동
        elif lst[i][j] == 1:
            num = j - 1 # 아래로 이동하고 계속 오른쪽으로 움직이기 위해 num 지정
            break # 두번째 for문 break로 첫번째 for문으로 넘어가 아래로 이동

## 3) 경로 출력하기        
for i in range(10):
    for j in range(10):
        print(lst[i][j], end=' ')
    print()

📝 나의 풀이법

1️⃣ 이중 for문으로 구성한다.

개미는 오른쪽으로 이동하며, 벽이 있을 경우에만 아래로 이동한다.

첫번째 for문을 아래로 이동, 두번째 for문을 오른쪽으로 이동으로 연결해준다.

‼ 주의점 

오른쪽으로 이동한 후에는 해당 자리에서 아래로 이동하는 것으로 오른쪽으로 이동한 위치를 가지고 있을 변수(num)가 필요하다.

2️⃣ 개미가 움직이지 않을 때, 모두를 고려한다.

1)  먹이를 찾은 경우

먹이(2)를 찾은 경우에는 개미가 먹이로 이동한 후, 움직이지 않는다. 이 때는 이중 for문 모두가 멈춰져야한다. 그렇기에, 두번째 for문에서 break로 나오고 첫번째 for문을 멈추기위해서 breaks라는 변수를 사용하여 첫번째 for문도 멈추게 했다.

2) 벽이 있음으로 아래로 이동하는 경우

벽이 있는 경우에는 아래로 이동하지만, 해당 자리에서 아래로 이동한다. 위의 1️⃣에서 언급했듯이 num 변수에 넣어 아래로 이동 후, 오른쪽 방향으로 이동하는 두번째 for문에서 num 변수를 통해 그 자리부터 시작해서 이동하게 된다.

 

 

 

 

참고 문제 : https://codeup.kr/problem.php?id=6098