프로그래밍 문제 풀이/코드업(파이썬)

코드업[CodeUp] Python 기초 100제 [6098번]

태은코딩 2024. 2. 5. 15:58

6098 : [기초-리스트] 설탕과자 뽑기(py)

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

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

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

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

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

미로 상자의 구조가 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

 

정답 및 가능한 정답

chart=[]
for i in range(10):
    a=list(map(int,input().split()))
    chart.append(a)

x=1
y=1
while True:
    # 현재 좌표값 확인
    # 좌표값이 0이면 9로 해놓고, 먹이인 2이면 9로 바꾸고 break
    if (chart[x][y] == 0):  
        chart[x][y] = 9
    elif (chart[x][y] == 2):
        chart[x][y] = 9
        break
        
    # 이동상황
    # 오른쪽, 아래 모두 갈수 없다면 break
    # 우측에 길이 있으면 y+=1
    # 아래에 길이 있다면 x+=1
    if ((chart[x][y+1] == 1 and chart[x+1][y] == 1)):
        break
    elif (chart[x][y+1] != 1):
        y+=1
    elif (chart[x+1][y] != 1):
        x+=1

for i in range(10):
    for j in range(10):
        print(chart[i][j],end=" ")
    print()
m=[]
for i in range(12) :
  m.append([])
  for j in range(12) :
    m[i].append(0)

for i in range(10) :
  a=input().split()
  for j in range(10) :
    m[i+1][j+1]=int(a[j])

x = 2
y = 2
while True :
  if m[x][y] == 0 :
    m[x][y] = 9
  elif m[x][y] == 2 :
    m[x][y] = 9
    break

  if (m[x][y+1]==1 and m[x+1][y]==1) or (x==9 and y==9) :
    break

  if m[x][y+1] != 1 :
    y += 1
  elif m[x+1][y] != 1 :
    x += 1
    

for i in range(1, 11) :
  for j in range(1, 11) :
    print(m[i][j], end=' ')
  print()

 

해설

먼저 입력받는 10*10 크기의 미로 상자를 2차원 리스트로 생성한다.

 그다음 while 문을 이용해서 각 좌표값을 변경해 준다.
(1,1)부터 시작해서 값이 0이면 9로 변경, 값이 2이면 9로 변경 후 break 하게 한다.

그다음 이동 상황에서 먼저 오른쪽 왼쪽 모두 막혀있으면 break 하게 설정하고 
우측에 벽이 없으면 우측으로 이동,
아래에 벽이 없으면 아래로 이동하도록 코드를 작성한다.

그다음 for 문으로 2차원 리스트를 출력하게 한다.