문제
비행기에서 뛰어내려 특정 좌표에 도착해 전투를 시작한다. 전투 투시경을 통해 현재 위치에서 모든 적의 위치가 보인다. 일단 전투를 시작하기 전 현재 위치에서 각각의 적의 위치까지 도착하는데에 걸리는 시간을 미리 구해놓을려고 한다. 거리는 현재 위치 (a, b)와 적의 위치 (c, d)를 알면 |a-c| + |b-d| 로 구할 수 있다. 이동하는데에 소요되는 시간은 격자판 기준 1칸 이동시 1분이 소요된다.
위 그림과 같이 적들이 존재하는 경우를 예로 들어보자. (4, 3)에 낙하했다면 오른쪽 그림과 같이 각 적들까지의 거리가 계산된다. 이동은 상하좌우로만 할 수 있으며, 대각선으로는 이동할 수 없다.
전장의 정보와 낙하 지점이 주어졌을때, 낙하 지점에서 각 적까지의 시간을 구하여 출력해보자.
입력
첫 번째 줄에 전장의 크기 N이 주어진다.
두 번째 줄부터 N개의 줄에 걸쳐 전장의 정보가 주어진다. 각 줄은 N개의 숫자로 이루어져 있으며, 각 숫자는 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 중에 하나이다. 0은 아무것도 없음, 1 ~ 8은 적, 9는 낙하 지점을 의미한다. 9는 하나만 주어진다.
왼쪽 최상단의 좌표는 (1, 1)이다.
(2 ≤ N ≤ 20)
출력
주어진 전장의 정보에서 적의 위치 칸은 낙하 지점에서의 시간을 출력한다. 낙하 지점은 '*'로 출력한다. 나머지 칸의 경우 0을 출력한다.
입력의 예 1
5
0 1 0 1 0
0 0 0 0 2
0 2 0 2 0
0 3 9 0 0
1 3 0 0 0
출력의 예 1
0 4 0 4 0
0 0 0 0 4
0 2 0 2 0
0 1 * 0 0
3 2 0 0 0
입력의 예 2
7
1 1 0 5 9 1 3
5 2 3 1 6 2 2
7 0 5 1 1 4 1
4 0 0 3 1 2 1
0 0 1 6 7 0 1
3 8 1 2 6 1 8
0 6 1 0 5 0 8
출력의 예 2
4 3 0 1 * 1 2
5 4 3 2 1 2 3
6 0 4 3 2 3 4
7 0 0 4 3 4 5
0 0 6 5 4 0 6
9 8 7 6 5 6 7
0 9 8 0 6 0 8
풀이1
- 맵 생성 후 공격수인 9를 찾은 다음 공격수 x좌표, 공격수 y좌표 거리 계산
- 0, 0부터 시작하면서 거리를 계산( |공격수x-현재값x|+|공격수y-현재값y| )
#0,0부터 반복하면서 |공격수x-현재값x|+|공격수y-현재값y| 거리 계산
def distance_enemy_cal(row, map, attacker_x, attacker_y) :
result = []
for x in range(row) :
temp_list = []
for y in range(row) :
if map[x][y] == 0 : #원래 값이 0인 값은 그냥 0임
temp_list.append(0)
else : #0이 아닌 값들은 |공격수x-현재값x|+|공격수y-현재값y|
now_enemy = abs(attacker_x - x) + abs(attacker_y - y)
if now_enemy == 0 : #|공격수x-현재값x|+|공격수y-현재값y| = 0 이면 공격수 자리이므로 * 표시
temp_list.append("*")
continue
temp_list.append(now_enemy)
result.append(temp_list)
return result
if __name__ == "__main__":
row = int(input()) #n*n 행렬 너비 입력
map_data = []
result_data = []
attacker_x = -1 #공격수 x좌표, y좌표 초기 값은 -1
attacker_y = -1
for i in range(row) : #맵 데이터 입력 받아서 맵 생성
map_data.append(list(map(int, input().split())))
for x in range(row) :
for y in range(row) :
if map_data[x][y] == 9 : #9(공격수 좌표) 찾기
attacker_x = x
attacker_y = y
result_data = distance_enemy_cal(row, map_data, attacker_x, attacker_y)
for i in range(row) :
print(" ".join(map(str, result_data[i])))
풀이2
- 입력 받으면서 공격 수 9 좌표 찾기
#0,0부터 반복하면서 |공격수x-현재값x|+|공격수y-현재값y| 거리 계산
def distance_enemy_cal(row, map, attacker_x, attacker_y) :
result = []
for x in range(row) :
temp_list = []
for y in range(row) :
if map[x][y] == 0 : #원래 값이 0인 값은 그냥 0임
temp_list.append(0)
else : #0이 아닌 값들은 |공격수x-현재값x|+|공격수y-현재값y|
now_enemy = abs(attacker_x - x) + abs(attacker_y - y)
if now_enemy == 0 : #|공격수x-현재값x|+|공격수y-현재값y| = 0 이면 공격수 자리이므로 * 표시
temp_list.append("*")
continue
temp_list.append(now_enemy)
result.append(temp_list)
return result
if __name__ == "__main__":
row = int(input()) #n*n 행렬 너비 입력
map_data = []
data = []
result_data = []
attacker_x = -1 #공격수 x좌표, y좌표 초기 값은 -1
attacker_y = -1
for x in range(row) : #맵 데이터 입력 받아서 맵 생성
data = list(map(int, input().split()))
map_data.append(data)
for y in range(len(data)) : #입력 받으면서 공격수 9 찾기
if data[y] == 9 :
attacker_x = x
attacker_y = y
result_data = distance_enemy_cal(row, map_data, attacker_x, attacker_y)
for i in range(row) :
print(" ".join(map(str, result_data[i])))
입력 받은 후에, 공격수인 9를 찾기
if __name__ == "__main__":
row = int(input()) #n*n 행렬 너비 입력
map_data = []
result_data = []
attacker_x = -1 #공격수 x좌표, y좌표 초기 값은 -1
attacker_y = -1
for i in range(row) : #맵 데이터 입력 받아서 맵 생성
map_data.append(list(map(int, input().split())))
for x in range(row) :
for y in range(row) :
if map_data[x][y] == 9 : #9(공격수 좌표) 찾기
attacker_x = x
attacker_y = y
print(map_data[x][y], attacker_x, attacker_y)
입력 받으면서 공격수인 9를 찾기
- 입력 받으면서 공격수 찾는 경우가 조금 더 빠른 것 같다.
if __name__ == "__main__":
row = int(input()) #n*n 행렬 너비 입력
map_data = []
data = []
result_data = []
attacker_x = -1 #공격수 x좌표, y좌표 초기 값은 -1
attacker_y = -1
for x in range(row) : #맵 데이터 입력 받아서 맵 생성
data = list(map(int, input().split()))
map_data.append(data)
for y in range(len(data)) :
if data[y] == 9 :
attacker_x = x
attacker_y = y
print(map_data[x][y], attacker_x, attacker_y)
'코테풀이 > BFS' 카테고리의 다른 글
전장속으로 - 최종 (0) | 2022.02.15 |
---|---|
전장속으로 - E (0) | 2022.02.14 |
전장속으로 - D (0) | 2022.02.14 |
전장속으로 - C(BFS & 좌표별 최단거리) (0) | 2022.02.14 |
전장속으로 - A (0) | 2022.02.14 |