[ํ๋ก๊ทธ๋๋จธ์ค, Java] ๋น์ ๊ฒฝ๋ก ์ฌ์ดํด
๐ ๋ฌธ์ ๋งํฌ
https://programmers.co.kr/learn/courses/30/lessons/86052
๐ค ๋ฌธ์
๊ฐ ์นธ๋ง๋ค S, L, ๋๋ R๊ฐ ์จ์ ธ ์๋ ๊ฒฉ์๊ฐ ์์ต๋๋ค. ๋น์ ์ ์ด ๊ฒฉ์์์ ๋น์ ์๊ณ ์ ํฉ๋๋ค. ์ด ๊ฒฉ์์ ๊ฐ ์นธ์๋ ๋ค์๊ณผ ๊ฐ์ ํน์ดํ ์ฑ์ง์ด ์์ต๋๋ค.
- ๋น์ด "S"๊ฐ ์จ์ง ์นธ์ ๋๋ฌํ ๊ฒฝ์ฐ, ์ง์งํฉ๋๋ค.
- ๋น์ด "L"์ด ์จ์ง ์นธ์ ๋๋ฌํ ๊ฒฝ์ฐ, ์ขํ์ ์ ํฉ๋๋ค.
- ๋น์ด "R"์ด ์จ์ง ์นธ์ ๋๋ฌํ ๊ฒฝ์ฐ, ์ฐํ์ ์ ํฉ๋๋ค.
- ๋น์ด ๊ฒฉ์์ ๋์ ๋์ด๊ฐ ๊ฒฝ์ฐ, ๋ฐ๋์ชฝ ๋์ผ๋ก ๋ค์ ๋์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋น์ด 1ํ์์ ํ์ด ์ค์ด๋๋ ๋ฐฉํฅ์ผ๋ก ์ด๋ํ ๊ฒฝ์ฐ, ๊ฐ์ ์ด์ ๋ฐ๋์ชฝ ๋ ํ์ผ๋ก ๋ค์ ๋์์ต๋๋ค.
๋น์ ์ ์ด ๊ฒฉ์ ๋ด์์ ๋น์ด ์ด๋ํ ์ ์๋ ๊ฒฝ๋ก ์ฌ์ดํด์ด ๋ช ๊ฐ ์๊ณ , ๊ฐ ์ฌ์ดํด์ ๊ธธ์ด๊ฐ ์ผ๋ง์ธ์ง ์๊ณ ์ถ์ต๋๋ค. ๊ฒฝ๋ก ์ฌ์ดํด์ด๋, ๋น์ด ์ด๋ํ๋ ์ํ ๊ฒฝ๋ก๋ฅผ ์๋ฏธํฉ๋๋ค.
์๋ฅผ ๋ค์ด, ๋ค์ ๊ทธ๋ฆผ์ ๊ฒฉ์ ["SL","LR"]
์์ 1ํ 1์ด์์ 2ํ 1์ด ๋ฐฉํฅ์ผ๋ก ๋น์ ์ ๊ฒฝ์ฐ, ํด๋น ๋น์ด ์ด๋ํ๋ ๊ฒฝ๋ก ์ฌ์ดํด์ ํํํ ๊ฒ์
๋๋ค.
์ด ๊ฒฉ์์๋ ๊ธธ์ด๊ฐ 16์ธ ์ฌ์ดํด 1๊ฐ๊ฐ ์์ผ๋ฉฐ, ๋ค๋ฅธ ์ฌ์ดํด์ ์กด์ฌํ์ง ์์ต๋๋ค.
๊ฒฉ์์ ์ ๋ณด๋ฅผ ๋ํ๋ด๋ 1์ฐจ์ ๋ฌธ์์ด ๋ฐฐ์ด grid
๊ฐ ๋งค๊ฐ๋ณ์๋ก ์ฃผ์ด์ง๋๋ค. ์ฃผ์ด์ง ๊ฒฉ์๋ฅผ ํตํด ๋ง๋ค์ด์ง๋ ๋น์ ๊ฒฝ๋ก ์ฌ์ดํด์ ๋ชจ๋ ๊ธธ์ด๋ค์ ๋ฐฐ์ด์ ๋ด์ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ์ฌ return ํ๋๋ก solution ํจ์๋ฅผ ์์ฑํด์ฃผ์ธ์.
๐ ์ ํ์ฌํญ
- 1 โค
grid
์ ๊ธธ์ด โค 500- 1 โค
grid
์ ๊ฐ ๋ฌธ์์ด์ ๊ธธ์ด โค 500 grid
์ ๋ชจ๋ ๋ฌธ์์ด์ ๊ธธ์ด๋ ์๋ก ๊ฐ์ต๋๋ค.grid
์ ๋ชจ๋ ๋ฌธ์์ด์'L', 'R', 'S'
๋ก ์ด๋ฃจ์ด์ ธ ์์ต๋๋ค.
- 1 โค
๐ฎ ๋ฌธ์ ํด๊ฒฐ ๋ฐฉ๋ฒ
๊ฐ ๋ ธ๋์ ์ง์ ๊ฒฝ๋ก (์, ํ, ์ข, ์ฐ)์์ ๋น์ด ๋ค์ด์จ ๊ฒฝ์ฐ๋ฅผ ๋ชจ๋ ํ๋จํ๊ณ , ์ด๋ฏธ ํด๋น ์ง์ ๊ฒฝ๋ก๋ก ๋ค์ด์จ ๊ฒฝ์ฐ๋ฅผ ๋ง๋๋ฉด ์ฌ์ดํด์ด ์๋ค๊ณ ํ๋จํ๋ฉด ๋๋ค.
์ฆ, ๋ฐฉ๋ฌธํ์ง ์์ ๋ชจ๋ ๋ ธ๋ ๋ฐ ๋ฐฉํฅ์ ๋ํด BFS๋ฅผ ์งํํด์ฃผ๊ณ , ๊ฐ ๋ ธ๋์ โSโ,โLโ,โRโ ์ ๋ฐ๋ผ ๋ค์ ๋ ธ๋์ ์ง์ ๋ฐฉํฅ์ ๊ฒฐ์ ํด ์ฃผ๊ธฐ๋ง ํ๋ฉด ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋น์ด ๊ฒฉ์์ ๋ง์ง๋ง์ ๋ค๋ค๋ฅธ ๊ฒฝ์ฐ ๋ฐ๋์ชฝ ๋์ผ๋ก ์ค๋ ๊ฒฝ์ฐ๋ง ์ฒดํฌํด์ฃผ๋ฉด ๋๋ค.
ํ๋์ ๋ ธ๋์์ ์, ํ, ์ข, ์ฐ ๋ฐฉํฅ์ ๋ฐฉ๋ฌธํ๋์ง ๋ชจ๋ ์ฒดํฌํด์ฃผ์ด์ผ ํ๋ฏ๋ก ๋ฐฉ๋ฌธ ๋ฐฐ์ด์ 3์ฐจ์ ๋ฐฐ์ด(ํ, ์ด, ๋ฐฉํฅ)์ผ๋ก ์ ์ธํด์ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ์ฌ๋ถ๋ฅผ ํ๋จํ๋ค.
๋จผ์ ๊ฐ ๋ ธ๋์ ์ง์ ๋ฐฉํฅ ๋ณ ๋ค์ ๋ ธ๋์ ๋ฐฉํฅ์ด ์ด๋ป๊ฒ ๊ฒฐ์ ๋๋์ง ํ์ธํ๋ค.
์,ํ,์ข,์ฐ ๋ฐฉํฅ์ ๊ฐ๊ฐ 0, 1, 2, 3์ผ๋ก ๋ณธ๋ค.
์ง์ ๋ ธ๋ ๋ฐฉํฅ ๋ณ ๋ค์ ๋ ธ๋ ์ง์ ๋ฐฉํฅ ํ๋จ
์ง์ ๋ ธ๋๊ฐ โSโ์ธ ๊ฒฝ์ฐ
์ง์ ๋ ธ๋๊ฐ โLโ์ธ ๊ฒฝ์ฐ
์ง์ ๋ ธ๋๊ฐ โRโ์ธ ๊ฒฝ์ฐ
์ง์ ๋ ธ๋์ โSโ, โLโ, โRโ ๋ณ ๋ค์ ๋ ธ๋ ์ง์ ๋ฐฉํฅ์ ํ๋ก ์ ๋ฆฌํด๋ณด๋ฉด ์๋์ ๊ฐ๋ค.
โSโ | โLโ | โRโ | |
---|---|---|---|
์ (0) | ์ (0) | ์ข (2) | ์ฐ (3) |
ํ (1) | ํ (1) | ์ฐ (3) | ์ข (2) |
์ข (2) | ์ข (2) | ์ (0) | ์ (0) |
์ฐ (3) | ์ฐ (3) | ํ (1) | ํ (1) |
๋๋ฒ์งธ๋ก, ๋ค์ ์ง์ ๋ ธ๋๊ฐ ๋์ ๋์ด๊ฐ ๊ฒฝ์ฐ ํ๋จ
- ํ์ฌ ๋
ธ๋์ ์ง์ถ ๋ฐฉํฅ์ด ๋ง์ง๋ง ํ(n-1) ์ ํ๋จ์ธ ๊ฒฝ์ฐ ๋ค์ ๋
ธ๋์ ์ง์
๋ฐฉํฅ์ ์ฒซ๋ฒ์งธ ํ โ0(์)โ ๋ฐฉํฅ
- ์ง์ ๋ฐฉํฅ์ด ์๋จ (0)์ด๊ณ ํ์ฌ ๋ ธ๋๊ฐ โSโ
- ์ง์ ๋ฐฉํฅ์ด ์ฐ์ธก (3)์ด๊ณ ํ์ฌ๋ ธ๋๊ฐ โLโ
- ์ง์ ๋ฐฉํฅ์ด ์ข์ธก (2)์ด๊ณ ํ์ฌ๋ ธ๋๊ฐ โRโ
- ๋ค์ ๋ ธ๋์ nextRow = 0
- ํ์ฌ ๋
ธ๋์ ์ง์ถ ๋ฐฉํฅ์ด ์ฒซ๋ฒ์ฌ ํ์ ์๋จ์ธ ๊ฒฝ์ฐ ๋ค์ ๋
ธ๋์ ์ง์
๋ฐฉํฅ์ ๋ง์ง๋ง ํ(n-1)์ โ1(ํ)โ ๋ฐฉํฅ
- ์ง์ ๋ฐฉํฅ์ด ํ๋จ (1)์ด๊ณ ํ์ฌ๋ ธ๋๊ฐ โSโ
- ์ง์ ๋ฐฉํฅ์ด ์ข์ธก (2)์ด๊ณ ํ์ฌ๋ ธ๋๊ฐ โLโ
- ์ง์ ๋ฐฉํฅ์ด ์ฐ์ธก (3)์ด๊ณ ํ์ฌ๋ ธ๋๊ฐ โRโ
- ๋ค์ ๋ ธ๋์ nextRow = n-1
- ํ์ฌ ๋
ธ๋์ ์ง์ถ ๋ฐฉํฅ์ด ๋ง์ง๋ง ์ด(n-1)์ ์ฐ์ธก์ธ ๊ฒฝ์ฐ ๋ค์ ๋
ธ๋์ ์ง์
๋ฐฉํฅ์ ์ฒซ๋ฒ์งธ ์ด์ โ2(์ข)โ ๋ฐฉํฅ
- ์ง์ ๋ฐฉํฅ์ด ์ข์ธก (2)์ด๊ณ ํ์ฌ๋ ธ๋๊ฐ โSโ
- ์ง์ ๋ฐฉํฅ์ด ํ๋จ (1)์ด๊ณ ํ์ฌ๋ ธ๋๊ฐ โRโ
- ์ง์ ๋ฐฉํฅ์ด ์๋จ (0)์ด๊ณ ํ์ฌ๋ ธ๋๊ฐ โLโ
- ๋ค์ ๋ ธ๋์ nextCol = 0
- ํ์ฌ ๋
ธ๋์ ์ง์ถ ๋ฐฉํฅ์ด ์ฒซ๋ฒ์งธ ์ด์ ์ข์ธก์ธ ๊ฒฝ์ฐ ๋ค์ ๋
ธ๋์ ์ง์
๋ฐฉํฅ์ ๋ง์ง๋ง ์ด(n-1)์ โ3(์ฐ)โ ๋ฐฉํฅ
- ์ง์ ๋ฐฉํฅ์ด ์ฐ์ธก (3)์ด๊ณ ํ์ฌ๋ ธ๋๊ฐ โSโ
- ์ง์ ๋ฐฉํฅ์ด ํ๋จ (1)์ด๊ณ ํ์ฌ๋ ธ๋๊ฐ โLโ
- ์ง์ ๋ฐฉํฅ์ด ์๋จ (2)์ด๊ณ ํ์ฌ๋ ธ๋๊ฐ โRโ
- ๋ค์ ๋ ธ๋์ nxtCol = n-1
๋ง์ง๋ง์ผ๋ก, ๋น์ด ๋ ธ๋์ ์ง์ ํ ๋๋ง๋ค ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ๊ณ , ์ง์ถํ ๋๋ง๋ค ์ฌ์ดํด ํ์๋ฅผ ์ฆ๊ฐ์ํค๊ณ , ๋ค์ ๋ ธ๋์ ์ง์ ๋ฐฉํฅ์ด ์ด๋ฏธ ๋ฐฉ๋ฌธํ ๋ฐฉํฅ์ด๋ฉด ์ฌ์ดํด ํ์๋ฅผ ์ ๋ต๋ฐฐ์ด์ ๋ฃ์ด์ค๋ค.
๐ฉ Java ์ฝ๋
package com.algorithm.Programmers.Lv2;
import java.util.*;
public class Solution_86052_๋น์_๊ฒฝ๋ก_์ฌ์ดํด {
public static void main(String[] args) {
String[] grid = {"R","R"};
int[] solution = solution(grid);
for (int x : solution) System.out.println("x = " + x);
}
static class Point {
private int row;
private int col;
private int dir;
public Point(int row, int col, int dir) {
this.row = row;
this.col = col;
this.dir = dir;
}
public int getRow() {
return row;
}
public int getCol() {
return col;
}
public int getDir() {
return dir;
}
}
private static String[][] map;
private static boolean[][][] visited;
private static int[] solution(String[] grid) {
map = new String[grid.length][grid[0].length()];
visited = new boolean[grid.length][grid[0].length()][4];
List<Integer> answerList = new ArrayList<>();
for (int row = 0; row < grid.length; row++) {
for (int col = 0; col < grid[row].length(); col++) {
map[row][col] = String.valueOf(grid[row].charAt(col));
}
}
for(int row = 0; row< map.length; row++) {
for(int col = 0; col < map[row].length; col++){
// 0 : ์, 1: ํ, 2: ์ข, 3: ์ฐ
for(int direction = 0; direction < 4; direction++) {
if(!visited[row][col][direction]) {
answerList.add(searchPath(row, col, direction));
}
}
}
}
Collections.sort(answerList);
return answerList.stream().mapToInt(Integer::intValue).toArray();
}
private static int searchPath(int row, int col, int direction) {
int count = 0;
Queue<Point> queue = new LinkedList<>();
queue.add(new Point(row, col, direction));
while(!queue.isEmpty()) {
Point point = queue.poll();
int curX = point.getRow();
int curY = point.getCol();
int curDir = point.getDir();
if(visited[curX][curY][curDir]) return count;
visited[curX][curY][curDir] = true;
// ๋ค์ ๋
ธ๋ ์ง์
๋ฐฉํฅ ๊ตฌํ๊ธฐ
Point next = nextPath(curX, curY, curDir);
// ๋ค์ ๋
ธ๋ ํ์ ์ถ๊ฐ
queue.add(new Point(next.getRow(), next.getCol(), next.getDir()));
// ์ง์
ํ ๋
ธ๋ ๊ฐฏ์ ์ฆ๊ฐ
count++;
}
return count;
}
// ๋ค์ ๋
ธ๋ ์ง์
๋ฐฉํฅ ๊ตฌํ๊ธฐ
private static Point nextPath(int curX, int curY, int curDir) {
int nextRow = curX;
int nextCol = curY;
int nextDir = curDir;
// ํ์ฌ ๋
ธ๋ ์ง์
๋ฐฉํฅ ๋ณ ๋ค์ ๋
ธ๋ ์ง์
๋ฐฉํฅ
if((map[curX][curY].equals("S") && curDir ==0) || (map[curX][curY].equals("L") && curDir == 3) || (map[curX][curY].equals("R") && curDir == 2)) {
nextRow = curX +1;
nextDir = 0;
}
else if((map[curX][curY].equals("S") && curDir ==1) || (map[curX][curY].equals("L") && curDir == 2) || (map[curX][curY].equals("R") && curDir == 3)) {
nextRow = curX -1;
nextDir = 1;
}
else if((map[curX][curY].equals("S") && curDir ==2) || (map[curX][curY].equals("L") && curDir == 0) || (map[curX][curY].equals("R") && curDir == 1)) {
nextCol = curY +1;
nextDir = 2;
}
else {
nextCol = curY-1;
nextDir = 3;
}
// ๋ค์ ๋
ธ๋์ ํ ํน์ ์ด์ด ๋ฒ์ ๋ฐ์ผ๋ก ๋ฒ์ด๋๋ ๊ฒฝ์ฐ ์ฒดํฌ
if(checkEndpoint(nextRow, nextCol)) {
if(nextDir == 0) {
nextRow = 0;
}
else if(nextDir == 1) {
nextRow = map.length-1;
}
else if(nextDir == 2) {
nextCol = 0;
}
else {
nextCol = map[nextRow].length-1;
}
}
return new Point(nextRow, nextCol, nextDir);
}
private static boolean checkEndpoint(int nextRow, int nextCol) {
return nextRow < 0 || nextRow >= map.length || nextCol < 0 || nextCol >= map[nextRow].length;
}
}