성공
🔗 6098 : [기초-리스트] 성실한 개미(py)
문제 설명
영일이는 생명과학에 관심이 생겨 왕개미를 연구하고 있었다.
왕개미를 유심히 살펴보던 중 특별히 성실해 보이는 개미가 있었는데,
그 개미는 개미굴에서 나와 먹이까지 가장 빠른 길로 이동하는 것이었다.
개미는 오른쪽으로 움직이다가 벽을 만나면 아래쪽으로 움직여 가장 빠른 길로 움직였다.
(오른쪽에 길이 나타나면 다시 오른쪽으로 움직인다.)
이에 호기심이 생긴 영일이는 그 개미를 미로 상자에 넣고 살펴보기 시작하였다.
미로 상자에 넣은 개미는 먹이를 찾았거나, 더 이상 움직일 수 없을 때까지
오른쪽 또는 아래쪽으로만 움직였다.
미로 상자의 구조가 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
출력
성실한 개미가 이동한 경로를 9로 표시해 출력한다.
출력 예시
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)
[1 - 5] : 모든 원소가 0인 2차원 리스트 생성
for i in range(10) :
a=input().split()
for j in range(10) :
m[i+1][j+1]=int(a[j])
[7 - 10] : 입력 받은 값을 int형으로 변환
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
[12 - 27]
- 값이 0인 경우, 9로 변경하고 값이 2인 경우는 9로 변경 후 while 문을 중단.
- y 좌표 다음 값이 1이면서 x 좌표 다음 값이 1이거나 x가 9이면서 y가 9일 때 while 문을 중단. (= 오른쪽, 아래 모두 벽으로 가로막히거나 맨 끝일 때 while 문을 중단)
- 다음 y좌표 값이 1이 아니면 y 좌표에 1을 더하고 다음 x 좌표 값이 1이 아니면 x 좌표에 1을 더함. (= 벽이 아니면 x, y 좌표값을 늘림)
for i in range(1, 11) :
for j in range(1, 11) :
print(m[i][j], end=' ')
print()
[30 - 33] : 테두리 부분을 제외한 2차원 리스트 출력. (= for 문 범위를 1 ~ 10으로 잡음)
Q. [1 - 5]에서 왜 10 * 10이 아니라, 12 * 12일까?
A. 리스트 인덱스가 0부터 시작되기 때문에 좌표값을 맞춰주기 위해 테두리 행, 열을 추가해서 12 * 12가 된 것으로 추측된다.
내 소스
소스 설명
ant_map = []
for i in range(10):
map_input = list(map(int, input().split()))
ant_map.append(map_input)
[1 - 4] : 입력 받은 값을 int형으로 변환해서 리스트로 저장하고 리스트에 추가.
flag = 1
for i in range(1,9):
while True:
if ant_map[i][flag] == 0:
ant_map[i][flag] = 9
elif ant_map[i][flag] == 1:
flag -= 1
break
elif ant_map[i][flag] == 2:
ant_map[i][flag] = 9
flag = -1
break
flag += 1
if flag == -1:
break
[6 - 22]
- 테두리 부분은 벽이기 때문에 for 문 범위를 1 ~ 8로 잡음
- flag와 while 문을 사용한 이유 : x 좌표에 비해 y 좌표의 변동이 크다고 생각해서 flag 변수로 y 좌표를 변경함. 또 조건에 따라 좌표를 변경하기 위해 for 문이 아닌 while 문을 사용.
- 값이 0이면 9로 교체하고 flag에 1을 더함. 값이 1이면 벽이므로 flag에서 1을 빼고 while 문을 빠져나와서 for 문을 실행. (= x 좌표가 변함, 아래쪽으로 이동) 값이 2이면 9로 교체하고 더 이상 이동하면 안되기 때문에 flag 값을 -1로 변경하고 while 문을 중단. flag가 -1인 경우, for문을 중단.
for i in range(10):
for j in range(10):
print(ant_map[i][j], end=' ')
print()
[24 - 27] : 2차원 리스트 출력
회고
모범 소스는 while 문 하나만 사용했고 나는 for문과 while 문을 중첩해서 사용하였다. 그래서 모범 소스가 더 좋은 코드인 것 같다. 중첩을 덜 사용할 수 있게 노력해야겠다.
* 잘못된 부분에 대해 댓글 남겨주시면 감사하겠습니다! 😀
'코딩테스트' 카테고리의 다른 글
[코테/백준] Python 30 - 10610번 (0) | 2023.01.24 |
---|---|
[코테/백준] Python ATM - 11399번 (0) | 2023.01.12 |
[코테/백준] Python 설탕 배달 - 2839번 (0) | 2023.01.12 |
[코테/CodeUp] Python 기초 100제 - 6096번 (0) | 2023.01.10 |
[코딩테스트] 계획 (0) | 2023.01.08 |
성공
🔗 6098 : [기초-리스트] 성실한 개미(py)
문제 설명
영일이는 생명과학에 관심이 생겨 왕개미를 연구하고 있었다.
왕개미를 유심히 살펴보던 중 특별히 성실해 보이는 개미가 있었는데,
그 개미는 개미굴에서 나와 먹이까지 가장 빠른 길로 이동하는 것이었다.
개미는 오른쪽으로 움직이다가 벽을 만나면 아래쪽으로 움직여 가장 빠른 길로 움직였다.
(오른쪽에 길이 나타나면 다시 오른쪽으로 움직인다.)
이에 호기심이 생긴 영일이는 그 개미를 미로 상자에 넣고 살펴보기 시작하였다.
미로 상자에 넣은 개미는 먹이를 찾았거나, 더 이상 움직일 수 없을 때까지
오른쪽 또는 아래쪽으로만 움직였다.
미로 상자의 구조가 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
출력
성실한 개미가 이동한 경로를 9로 표시해 출력한다.
출력 예시
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)
[1 - 5] : 모든 원소가 0인 2차원 리스트 생성
for i in range(10) :
a=input().split()
for j in range(10) :
m[i+1][j+1]=int(a[j])
[7 - 10] : 입력 받은 값을 int형으로 변환
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
[12 - 27]
- 값이 0인 경우, 9로 변경하고 값이 2인 경우는 9로 변경 후 while 문을 중단.
- y 좌표 다음 값이 1이면서 x 좌표 다음 값이 1이거나 x가 9이면서 y가 9일 때 while 문을 중단. (= 오른쪽, 아래 모두 벽으로 가로막히거나 맨 끝일 때 while 문을 중단)
- 다음 y좌표 값이 1이 아니면 y 좌표에 1을 더하고 다음 x 좌표 값이 1이 아니면 x 좌표에 1을 더함. (= 벽이 아니면 x, y 좌표값을 늘림)
for i in range(1, 11) :
for j in range(1, 11) :
print(m[i][j], end=' ')
print()
[30 - 33] : 테두리 부분을 제외한 2차원 리스트 출력. (= for 문 범위를 1 ~ 10으로 잡음)
Q. [1 - 5]에서 왜 10 * 10이 아니라, 12 * 12일까?
A. 리스트 인덱스가 0부터 시작되기 때문에 좌표값을 맞춰주기 위해 테두리 행, 열을 추가해서 12 * 12가 된 것으로 추측된다.
내 소스
소스 설명
ant_map = []
for i in range(10):
map_input = list(map(int, input().split()))
ant_map.append(map_input)
[1 - 4] : 입력 받은 값을 int형으로 변환해서 리스트로 저장하고 리스트에 추가.
flag = 1
for i in range(1,9):
while True:
if ant_map[i][flag] == 0:
ant_map[i][flag] = 9
elif ant_map[i][flag] == 1:
flag -= 1
break
elif ant_map[i][flag] == 2:
ant_map[i][flag] = 9
flag = -1
break
flag += 1
if flag == -1:
break
[6 - 22]
- 테두리 부분은 벽이기 때문에 for 문 범위를 1 ~ 8로 잡음
- flag와 while 문을 사용한 이유 : x 좌표에 비해 y 좌표의 변동이 크다고 생각해서 flag 변수로 y 좌표를 변경함. 또 조건에 따라 좌표를 변경하기 위해 for 문이 아닌 while 문을 사용.
- 값이 0이면 9로 교체하고 flag에 1을 더함. 값이 1이면 벽이므로 flag에서 1을 빼고 while 문을 빠져나와서 for 문을 실행. (= x 좌표가 변함, 아래쪽으로 이동) 값이 2이면 9로 교체하고 더 이상 이동하면 안되기 때문에 flag 값을 -1로 변경하고 while 문을 중단. flag가 -1인 경우, for문을 중단.
for i in range(10):
for j in range(10):
print(ant_map[i][j], end=' ')
print()
[24 - 27] : 2차원 리스트 출력
회고
모범 소스는 while 문 하나만 사용했고 나는 for문과 while 문을 중첩해서 사용하였다. 그래서 모범 소스가 더 좋은 코드인 것 같다. 중첩을 덜 사용할 수 있게 노력해야겠다.
* 잘못된 부분에 대해 댓글 남겨주시면 감사하겠습니다! 😀
'코딩테스트' 카테고리의 다른 글
[코테/백준] Python 30 - 10610번 (0) | 2023.01.24 |
---|---|
[코테/백준] Python ATM - 11399번 (0) | 2023.01.12 |
[코테/백준] Python 설탕 배달 - 2839번 (0) | 2023.01.12 |
[코테/CodeUp] Python 기초 100제 - 6096번 (0) | 2023.01.10 |
[코딩테스트] 계획 (0) | 2023.01.08 |