티스토리 뷰
문제 설명
ROR 게임은 두 팀으로 나누어서 진행하며, 상대 팀 진영을 먼저 파괴하면 이기는 게임입니다. 따라서, 각 팀은 상대 팀 진영에 최대한 빨리 도착하는 것이 유리합니다.
지금부터 당신은 한 팀의 팀원이 되어 게임을 진행하려고 합니다. 다음은 5 x 5 크기의 맵에, 당신의 캐릭터가 (행: 1, 열: 1) 위치에 있고, 상대 팀 진영은 (행: 5, 열: 5) 위치에 있는 경우의 예시입니다.
!https://grepp-programmers.s3.ap-northeast-2.amazonaws.com/files/production/dc3a1b49-13d3-4047-b6f8-6cc40b2702a7/최단거리1_sxuruo.png
위 그림에서 검은색 부분은 벽으로 막혀있어 갈 수 없는 길이며, 흰색 부분은 갈 수 있는 길입니다. 캐릭터가 움직일 때는 동, 서, 남, 북 방향으로 한 칸씩 이동하며, 게임 맵을 벗어난 길은 갈 수 없습니다.
아래 예시는 캐릭터가 상대 팀 진영으로 가는 두 가지 방법을 나타내고 있습니다.
- 첫 번째 방법은 11개의 칸을 지나서 상대 팀 진영에 도착했습니다.
!https://grepp-programmers.s3.ap-northeast-2.amazonaws.com/files/production/9d909e5a-ca95-4088-9df9-d84cb804b2b0/최단거리2_hnjd3b.png
- 두 번째 방법은 15개의 칸을 지나서 상대팀 진영에 도착했습니다.
!https://grepp-programmers.s3.ap-northeast-2.amazonaws.com/files/production/4b7cd629-a3c2-4e02-b748-a707211131de/최단거리3_ntxygd.png
위 예시에서는 첫 번째 방법보다 더 빠르게 상대팀 진영에 도착하는 방법은 없으므로, 이 방법이 상대 팀 진영으로 가는 가장 빠른 방법입니다.
만약, 상대 팀이 자신의 팀 진영 주위에 벽을 세워두었다면 상대 팀 진영에 도착하지 못할 수도 있습니다. 예를 들어, 다음과 같은 경우에 당신의 캐릭터는 상대 팀 진영에 도착할 수 없습니다.
!https://grepp-programmers.s3.ap-northeast-2.amazonaws.com/files/production/d963b4bd-12e5-45da-9ca7-549e453d58a9/최단거리4_of9xfg.png
게임 맵의 상태 maps가 매개변수로 주어질 때, 캐릭터가 상대 팀 진영에 도착하기 위해서 지나가야 하는 칸의 개수의 최솟값을 return 하도록 solution 함수를 완성해주세요. 단, 상대 팀 진영에 도착할 수 없을 때는 -1을 return 해주세요.
제한사항
- maps는 n x m 크기의 게임 맵의 상태가 들어있는 2차원 배열로, n과 m은 각각 1 이상 100 이하의 자연수입니다.
- n과 m은 서로 같을 수도, 다를 수도 있지만, n과 m이 모두 1인 경우는 입력으로 주어지지 않습니다.
- maps는 0과 1로만 이루어져 있으며, 0은 벽이 있는 자리, 1은 벽이 없는 자리를 나타냅니다.
- 처음에 캐릭터는 게임 맵의 좌측 상단인 (1, 1) 위치에 있으며, 상대방 진영은 게임 맵의 우측 하단인 (n, m) 위치에 있습니다.
입출력 예
maps answer
[[1,0,1,1,1],[1,0,1,0,1],[1,0,1,1,1],[1,1,1,0,1],[0,0,0,0,1]] | 11 |
[[1,0,1,1,1],[1,0,1,0,1],[1,0,1,1,1],[1,1,1,0,0],[0,0,0,0,1]] | -1 |
입출력 예 설명
입출력 예 #1
주어진 데이터는 다음과 같습니다.
!https://grepp-programmers.s3.ap-northeast-2.amazonaws.com/files/production/6db71f7f-58d3-4623-9fab-7cd99fa863a5/최단거리6_lgjvrb.png
캐릭터가 적 팀의 진영까지 이동하는 가장 빠른 길은 다음 그림과 같습니다.
!https://grepp-programmers.s3.ap-northeast-2.amazonaws.com/files/production/d223d017-b3e2-4772-9045-a565133d45ff/최단거리2_hnjd3b (1).png
따라서 총 11칸을 캐릭터가 지나갔으므로 11을 return 하면 됩니다.
입출력 예 #2
문제의 예시와 같으며, 상대 팀 진영에 도달할 방법이 없습니다. 따라서 -1을 return 합니다.
package LV2;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
public class H1844 {
// 상, 하, 좌, 우로 이동하기 위한 델타 배열
private final int[] dx = {-1, 1, 0, 0};
private final int[] dy = {0, 0, -1, 1};
public int solution(int[][] maps) {
int n = maps.length; // 맵의 세로 크기
int m = maps[0].length; // 맵의 가로 크기
int[][] dist = new int[n][m]; // 시작 위치부터 각 위치까지의 최단 거리를 저장할 배열
// dist 배열을 모두 -1로 초기화 (아직 방문하지 않은 위치를 의미)
for (int[] row : dist) {
Arrays.fill(row, -1);
}
Queue<int[]> queue = new LinkedList<>();
queue.offer(new int[]{0, 0}); // 시작 위치를 큐에 넣는다
dist[0][0] = 1; // 시작 위치의 거리는 1
// BFS 탐색 시작
while (!queue.isEmpty()) {
int[] cur = queue.poll(); // 현재 위치를 큐에서 꺼낸다
for (int dir = 0; dir < 4; dir++) { // 상하좌우 4방향으로 이동
int nx = cur[0] + dx[dir];
int ny = cur[1] + dy[dir];
// 맵의 범위를 벗어나거나 벽이 있는 경우 이동할 수 없음
if (nx < 0 || nx >= n || ny < 0 || ny >= m || maps[nx][ny] == 0) {
continue;
}
// 아직 방문하지 않은 위치인 경우
if (dist[nx][ny] == -1) {
dist[nx][ny] = dist[cur[0]][cur[1]] + 1; // 현재 위치의 거리 + 1
queue.offer(new int[]{nx, ny}); // 큐에 새로운 위치를 추가
}
}
}
// 도착지까지의 최단 거리를 반환. 도달할 수 없는 경우 -1을 반환
return dist[n-1][m-1];
}
}
그래프 탐색 문제로, 너비 우선 탐색(BFS) 알고리즘을 사용하여 해결할 수 있다. BFS는 시작 노드부터 가장 가까운 노드를 우선하여 그래프를 탐색하는 알고리즘이며, 이 문제에서는 시작 위치부터 목적지까지 가장 짧은 경로를 찾는 데 사용할 수 있다.
주어진 2차원 맵에서 이동 가능한 방향은 동, 서, 남, 북으로, 현재 위치에서 이동할 수 있는 위치를 큐에 넣어 탐색을 진행한다. 이 때, 맵의 범위를 벗어나거나 벽이 있는 곳(0)으로는 이동할 수 없다.
너비 우선 탐색(BFS) 알고리즘을 이용하여 주어진 맵에서 시작 위치(0, 0)부터 각 위치까지의 최단 거리를 구하고, 그 중 도착지(n-1, m-1)까지의 최단 거리를 반환
'알고리즘 > 프로그래머스 JAVA LV.2' 카테고리의 다른 글
[3차] n진수 게임 (0) | 2023.06.05 |
---|---|
[3차] 압축 (0) | 2023.05.31 |
오픈채팅방 (0) | 2023.05.30 |
k진수에서 소수 개수 구하기 (0) | 2023.05.30 |
[1차] 뉴스 클러스터링 (0) | 2023.05.30 |
- Total
- Today
- Yesterday
- (여자)아이들
- 12기
- 4주차
- python
- HTML
- ajax
- 아이들팬명록
- Til
- 현재기온넣기
- 웹개발3주차
- 항해
- 현재기온
- 아이들팬명록만들기
- aihtnyc_h
- 웹개발종합반
- 보험
- 팬방명록만들기
- 항해99
- 웹개발
- 스파르타
- 2주차
- 유형검사
- visualstudiocode
- 스파르타코딩
- 지니차트만들기
- 사전스터디
- 12기 1주차 숙제
- PyCharm
- 초보개발자
- 공부하기
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |