전장속으로 - B(두 좌표 거리)

파송송계란빡 ㅣ 2022. 2. 14. 11:40

문제


비행기에서 뛰어내려 특정 좌표에 도착해 전투를 시작한다. 전투 투시경을 통해 현재 위치에서 모든 적의 위치가 보인다. 일단 전투를 시작하기 전 현재 위치에서 각각의 적의 위치까지 도착하는데에 걸리는 시간을 미리 구해놓을려고 한다. 거리는 현재 위치 (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
전장속으로 - B(두 좌표 거리)