영일이는 생명과학에 관심이 생겨 왕개미를 연구하고 있었다.
왕개미를 유심히 살펴보던 중 특별히 성실해 보이는 개미가 있었는데,
그 개미는 개미굴에서 나와 먹이까지 가장 빠른 길로 이동하는 것이었다.
개미는 오른쪽으로 움직이다가 벽을 만나면 아래쪽으로 움직여 가장 빠른 길로 움직였다.
(오른쪽에 길이 나타나면 다시 오른쪽으로 움직인다.)
이에 호기심이 생긴 영일이는 그 개미를 미로 상자에 넣고 살펴보기 시작하였다.
미로 상자에 넣은 개미는 먹이를 찾았거나, 더 이상 움직일 수 없을 때까지
오른쪽 또는 아래쪽으로만 움직였다.
미로 상자의 구조가 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)
- 맵 입력을 받아야겠죠?
맵 입력은 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
- 개미의 시작은 지점은 (2, 2)라고 했으니 x, y의 값을 2로 넣어줍니다.
핵심을 하기 위해 while문을 써줍니다. while문 안에서 종료 시키기 위해 조건은 True로.x = 2 y = 2 while True :
- 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
- 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
- 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
- 출력! (맵에 표시를 할 때 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(): 괄호 안의 내용을 출력!
안녕하세요! 모범답안에서 질문이 생겨 댓글 남깁니다.
1. 자 이제 저번부터 해왔던 맵을 만듭니다.
(나중에 맵에 표시를 할 때 0부터 세는 것이 아닌 1부터 세어야 하기 때문에 맵 범위를 12로 잡습니다.)
라고 하셨는데 10*10인데 0부터 세는 것이 아닌 1부터 센다해도 range(11)로 하는 것이 아닌 왜 12로 하셨을까요?