문제
https://school.programmers.co.kr/learn/courses/30/lessons/159993
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
코드
import java.util.*;
class Solution {
public int solution(String[] maps) {
int n = maps.length;
int m = maps[0].length();
char [][] board = new char [n][m];
int start [] = new int [2];
int leber [] = new int [2];
int exit [] = new int [2];
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
board[i][j] = maps[i].charAt(j);
if(board[i][j] == 'S'){
start[0] = i;
start[1] = j;
}
else if(board[i][j] == 'L'){
leber[0] = i;
leber[1] = j;
}
else if(board[i][j] == 'E'){
exit[0] = i;
exit[1] = j;
}
}
}
int leberDist = leberBfs(n, m, start, board);
if(leberDist == -1) return -1;
int exitDist = exitBfs(n, m, leber, board);
if(exitDist == -1) return -1;
return leberDist+exitDist;
}
public int leberBfs(int n, int m, int [] start, char [][] board){
int [] dx = {1, 0, -1, 0};
int [] dy = {0, 1, 0, -1};
int visited[][] = new int [n][m];
for(int i=0;i<n;i++) {
Arrays.fill(visited[i], -1);
}
Queue<int []> que = new LinkedList<>();
que.add(new int []{start[0],start[1]});
visited[start[0]][start[1]] = 0;
while(!que.isEmpty()){
int cur [] = que.poll();
if(board[cur[0]][cur[1]] == 'L'){
return visited[cur[0]][cur[1]];
}
for(int i=0;i<4;i++){
int nx = cur[0] + dx[i];
int ny = cur[1] + dy[i];
if(nx < 0 || ny < 0 || nx >= n || ny >= m) continue;
if(board[nx][ny] == 'X') continue;
if(visited[nx][ny] == -1 || visited[nx][ny] > visited[cur[0]][cur[1]]+1){
que.add(new int [] {nx, ny});
visited[nx][ny] = visited[cur[0]][cur[1]]+1;
}
}
}
return -1;
}
public int exitBfs(int n, int m, int [] leber, char [][] board){
int [] dx = {1, 0, -1, 0};
int [] dy = {0, 1, 0, -1};
int visited[][] = new int [n][m];
for(int i=0;i<n;i++) {
Arrays.fill(visited[i], -1);
}
Queue<int []> que = new LinkedList<>();
que.add(new int []{leber[0],leber[1]});
visited[leber[0]][leber[1]] = 0;
while(!que.isEmpty()){
int cur [] = que.poll();
if(board[cur[0]][cur[1]] == 'E'){
return visited[cur[0]][cur[1]];
}
for(int i=0;i<4;i++){
int nx = cur[0] + dx[i];
int ny = cur[1] + dy[i];
if(nx < 0 || ny < 0 || nx >= n || ny >= m) continue;
if(board[nx][ny] == 'X') continue;
if(visited[nx][ny] == -1 || visited[nx][ny] > visited[cur[0]][cur[1]]+1){
que.add(new int [] {nx, ny});
visited[nx][ny] = visited[cur[0]][cur[1]]+1;
}
}
}
return -1;
}
}
중복되는 코드가 많아 하나의 함수로 합쳤다.
최종코드는 다음과 같다.
import java.util.*;
class Solution {
public int solution(String[] maps) {
int n = maps.length;
int m = maps[0].length();
char [][] board = new char [n][m];
int start [] = new int [2];
int leber [] = new int [2];
int exit [] = new int [2];
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
board[i][j] = maps[i].charAt(j);
if(board[i][j] == 'S'){
start[0] = i;
start[1] = j;
}
else if(board[i][j] == 'L'){
leber[0] = i;
leber[1] = j;
}
else if(board[i][j] == 'E'){
exit[0] = i;
exit[1] = j;
}
}
}
int leberDist = bfs(n, m, start, leber, board);
if(leberDist == -1) return -1;
int exitDist = bfs(n, m, leber, exit, board);
if(exitDist == -1) return -1;
return leberDist+exitDist;
}
public int bfs(int n, int m, int [] start, int [] end, char [][] board){
int [] dx = {1, 0, -1, 0};
int [] dy = {0, 1, 0, -1};
int visited[][] = new int [n][m];
for(int i=0;i<n;i++) {
Arrays.fill(visited[i], -1);
}
Queue<int []> que = new LinkedList<>();
que.add(new int []{start[0],start[1]});
visited[start[0]][start[1]] = 0;
while(!que.isEmpty()){
int cur [] = que.poll();
if(cur[0] == end[0] && cur[1] == end[1]){
return visited[cur[0]][cur[1]];
}
for(int i=0;i<4;i++){
int nx = cur[0] + dx[i];
int ny = cur[1] + dy[i];
if(nx < 0 || ny < 0 || nx >= n || ny >= m) continue;
if(board[nx][ny] == 'X') continue;
if(visited[nx][ny] == -1 || visited[nx][ny] > visited[cur[0]][cur[1]]+1){
que.add(new int [] {nx, ny});
visited[nx][ny] = visited[cur[0]][cur[1]]+1;
}
}
}
return -1;
}
}