[CodeUp 기초 100제] 6098번 풀이 with 파이썬(python) 마지막 문제

Jeony·2021년 9월 21일
0

codeup 기초 100제

목록 보기
98/98
post-thumbnail

문제

리스트

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

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

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

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

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

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

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

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

입력 예시

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

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

답안

모델 답안

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()

내 답안

feed_x, feed_y = 0, 0
# 미로 생성
m = []
for i in range(12):
    m.append([])
    # 미로 입력받음
    for j in range(12):
        m[i].append(0)

for i in range(10):
    m_input = input().split()
    for j in range(10):
        m[i+1][j+1] = int(m_input[j])
        # 먹이 위치 찾기
        if int(m_input[j]) == 2:
            feed_x, feed_y = i+1, j+1

x, y = 2, 2
while x != feed_x  or y != feed_y:	#먹이 위치와 좌표가 같을 때 실행 종료
    m[x][y] = 9
    # 움직이기
    if m[x][y+1] != 1:
        y += 1
    else:
        x += 1

    if x < 10 and y < 10:
        m[x][y] = 9
    else:
        break

# 결과 출력
for i in range(1, 11):
    for j in range(1, 11):
        print(m[i][j], end=" ")
    print()

풀이

역시 마지막 문제라 힌트도 없고 많이 어려웠네요..😹
그래도 끈기로 풀었습니다!
모델 답안 풀이가 궁금하실테니 각설하고 풀이 갑니다.

🔍모델 답안 풀이

1. 자 이제 저번부터 해왔던 맵을 만듭니다.
(나중에 맵에 표시를 할 때 0부터 세는 것이 아닌 1부터 세어야 하기 때문에 맵 범위를 12로 잡습니다.)

m=[]
for i in range(12) :
    m.append([])
    for j in range(12) :
        m[i].append(0)
  1. 맵 입력을 받아야겠죠?
    맵 입력은 10*10이라고 했으니 범위를 10으로 잡고 반복을 돌리며 입력을 받습니다.
    입력을 받고 바로 만들었던 중첩 리스트 맵에 입력값을 대입해줍니다.
    (나중에 맵에 표시를 할 때 0부터 세는 것이 아닌 1부터 세어야 하기 때문에 +1을 해줍니다.)
for i in range(10) :
    a=input().split()
    for j in range(10) :
        m[i+1][j+1]=int(a[j])


이제 핵심을 할 차례입니다.

  • 개미가 시작하는 곳(2, 2)부터 개미의 현재 자리가 0이면 9로, 2면 9로 만들고 종료.
  • 개미는 우선 오른쪽이 열여있으면(0) 오른쪽으로가고, 오른쪽이 막혀있으면(1) 아래쪽으로 간다. 둘다 막혀있거나 개미가 맵의 끝에 도달하면 종료.
  • 개미의 현재자리에서 오른쪽(y)이 0이 아니면 아랫쪽(x) +1, 오른쪽(y)이 0이면 오른쪽(y) +1
  1. 개미의 시작은 지점은 (2, 2)라고 했으니 x, y의 값을 2로 넣어줍니다.
    핵심을 하기 위해 while문을 써줍니다. while문 안에서 종료 시키기 위해 조건은 True로.
x = 2
y = 2
while True :
  1. m[x][y]는 개미의 위치 좌표예요. 개미가 있는 곳이 0이면 장애물이 없는 길이니까 9를 대입하고 2면 먹이를 찾았으니까 break(종료)를 시켜줘요.
if m[x][y] == 0 :
    m[x][y] = 9
elif m[x][y] == 2 :
    m[x][y] = 9
    break
  1. m[x][y+1](개미가 갈 다음 오른쪽)이 1(장애물)이고 m[x+1][y](개미가 갈 다음 아래쪽)이 1(장애물)이거나 x, y 모두 맵의 끝(9)이면 break(종료)
if (m[x][y+1]==1 and m[x+1][y]==1) or (x==9 and y==9) :
    break
  1. m[x][y+1](개미가 갈 다음 오른쪽)이 1(장애물)이 아니면 y(오른쪽 방향) +1
    m[x][y+1](개미가 갈 다음 아래쪽)이 1(장애물)이 아니면 x(아래쪽 방향) +1
    이렇게 while문 안의 핵심 조건들이 끝났다.
if m[x][y+1] != 1 :
    y += 1
elif m[x+1][y] != 1 :
    x += 1
  1. 출력! (맵에 표시를 할 때 0부터 세는 것이 아닌 1부터 세어야 하기 때문에 맵 범위를 1부터 11로 잡습니다.)
for i in range(1, 11) :
    for j in range(1, 11) :
        print(m[i][j], end=' ')
    print()

👻 끝! 👽

input(): 프롬프트를 띄워서 사용자의 입력 받을 수 있게 해준다.
(단, 입력 받은 것은 문자열로 저장된다. print(type()))으로 type() 괄호 안에 변수를 넣고 찍으면 정수인지, 문자열인지, 무슨 타입인지 확일 할 수 있다!)

int(n): 위의 input()에서 말했듯이 input으로 받은 값은 문자열로 저장된다.
산술을 하기 위해, 문자열을 정수로 변환시켜주는 int()를 써서 변환시켜준다.

[ ] list: 변수 안에 여러가지의 값을 넣을 수 있다.
선언 예시)
a = []
b = ["a", "b", "c"]

출력 예시)
print(a[]) -> 빈공간
print(b[0]) -> a
print(b[1]) -> b
print(b) -> ["a", "b", "c"]

while문: 조건이 True면 밑에 내용 실행!
while 조건식:
(들여쓰기칸) 실행문

while문은 조건식이 계속 맞도록 해주면 무한으로 반복할 수 있다!
ex)

while True
    print("ㅎㅎ")

멈추지 않는 이상 계속 반복

for문: 반복을 데이터가 남을 때까지 밑에 내용 계속 반복 실행!
for i in 데이터:
(들여쓰기칸) 실행문

ex)

for i in [1, 2 ,3]:
    print(i)
출력: 1
     2
     3

데이터에는 iterable이 들어갈 수 있다.

range(): 괄호 안에 들어가는 숫자만큼의 수열을 표현해준다.
range(3) -> 0, 1, 2 (0부터 3직전까지 표현)
range(1, 3) -> 1, 2 (1부터 시작해서 3직전까지 표현)
range(1, 3, +2) -> 1 (1부터 시작해서 2씩 늘려가서 3직전까지 표현. (1 + 2는 3이므로 3직전까지 표현))

print(): 괄호 안의 내용을 출력!

profile
알고리즘으로 문제를 해결하자 (ʘ言ʘ╬)

1개의 댓글

comment-user-thumbnail
2022년 2월 8일

안녕하세요! 모범답안에서 질문이 생겨 댓글 남깁니다.
1. 자 이제 저번부터 해왔던 맵을 만듭니다.
(나중에 맵에 표시를 할 때 0부터 세는 것이 아닌 1부터 세어야 하기 때문에 맵 범위를 12로 잡습니다.)
라고 하셨는데 10*10인데 0부터 세는 것이 아닌 1부터 센다해도 range(11)로 하는 것이 아닌 왜 12로 하셨을까요?

답글 달기