코디잉
프로그래머스 - 게임 맵 최단거리 (JAVA) 본문
https://school.programmers.co.kr/learn/courses/30/lessons/1844
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
접근 방식) BFS
1. 2차원 배열인 map을 상하좌우로 움직일거니까 static int[] dx, int[] dy 생성
움직인 거리 표시해줄 2차원 배열 static int visited[][] 생성
→ -1로 초기화해서 도착했든 못했든 상관 없이 -1 or 칸의 개수 최솟값 return 되게끔
2. BFS수행: 상하좌우 돌면서 map의 x, y에 벗어나지 않고, 방문하지 않았으면 큐에 추가하고 칸의 개수 1증가 시킴
→ 똑같은 BFS 방식인데 2가지로 풀어봤다. (프로그래머스 제출 후 시간 비교 사진 첨부)
1) int[] 배열 사용하여 Queue 생성
2) java.awt.Point 클래스 사용하여 Queue 생성
1) int[] 배열 사용하여 Queue 생성 → 더 빠름
import java.util.*;
class Solution {
static int[] dx = {0, 0, -1, 1};
static int[] dy = {1, -1, 0, 0};
static int[][] visited;
public int solution(int[][] maps) {
visited = new int[maps.length][maps[0].length];
BFS(maps, 0, 0);
if (visited[maps.length - 1][maps[0].length - 1] == 0)
return -1;
else
return visited[maps.length - 1][maps[0].length - 1];
}
static void BFS(int[][] maps, int i, int j) {
Queue<int[]> queue = new LinkedList<>();
queue.add(new int[]{i, j});
visited[i][j] = 1;
while (!queue.isEmpty()) {
int[] now = queue.poll();
for (int k = 0; k < 4; k++) {
int x = now[0] + dx[k];
int y = now[1] + dy[k];
if (x < 0 || y < 0 || x >= maps.length || y >= maps[0].length) continue;
if (maps[x][y] == 1 && visited[x][y] == 0) {
visited[x][y] = visited[now[0]][now[1]] + 1;
queue.add(new int[]{x, y});
}
}
}
}
}
2) java.awt.Point 클래스 사용하여 Queue 생성
import java.util.*;
import java.awt.Point;
class Solution {
static int[][] visited;
static int[] dx = {0, 0, -1, 1};
static int[] dy = {1, -1, 0, 0};
public int solution(int[][] maps) {
visited = new int[maps.length][maps[0].length];
for (int i = 0; i < visited.length; i++) {
for (int j = 0; j < visited[i].length; j++)
visited[i][j] = -1;
}
BFS(maps, 0, 0);
return visited[maps.length - 1][maps[0].length - 1];
}
static void BFS(int[][] maps, int i, int j) {
Queue<Point> queue = new LinkedList<>();
queue.add(new Point(i, j));
visited[i][j] = 1;
while (!queue.isEmpty()) {
Point now = queue.poll();
for (int k = 0; k < 4; k++) {
int x = now.x + dx[k];
int y = now.y + dy[k];
if (x >= 0 && y >= 0 && x < maps.length && y < maps[0].length) {
if (maps[x][y] != 0 && visited[x][y] == -1) {
visited[x][y] = visited[now.x][now.y] + 1;
queue.add(new Point(x, y));
}
}
}
}
}
}
'자료구조&알고리즘 > 프로그래머스' 카테고리의 다른 글
프로그래머스 - 미로탈출 (JAVA) (0) | 2023.10.13 |
---|---|
프로그래머스 - 최소직사각형 (JAVA) (0) | 2023.09.26 |
프로그래머스 - 성격 유형 검사하기 (JAVA) (0) | 2023.09.16 |
프로그래머스 - 기능개발 (JAVA) (0) | 2023.09.16 |
프로그래머스 - 폰켓몬 (JAVA) (0) | 2023.09.15 |
Comments