programmers.co.kr/learn/courses/30/lessons/49994?language=java
문제 해결 포인트는 A지점 -> B지점이면 B -> A가 이미 가본길이라는 것이다.
그래서 A -> B로 처음 갈때 count + 1을하고 A->B와 B->A 두 경우를 방문처리한다.
이를 위해서 visited[][][][] 와 같은 boolean 배열을 사용하였다.
배열에 음수를 사용할수 없으니 전체 좌표를 0부터 10까지를 잡고 시작점을 5,5로 잡았다.
class Position {
private int x;
private int y;
public Position(int x, int y) {
this.x = x;
this.y = y;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public boolean isRanged() {
return this.x >= 0 && this.x < 11 && this.y >= 0 && this.y < 11;
}
public Position getNextPosition(char c) {
// 상하좌우 U, D, L, R
int[] dx = {-1, 1, 0, 0};
int[] dy = {0, 0, -1, 1};
int temp = -1;
switch (c) {
case 'U':
temp = 0;
break;
case 'D':
temp = 1;
break;
case 'R':
temp = 2;
break;
default:
temp = 3;
break;
}
return new Position(this.x + dx[temp], this.y + dy[temp]);
}
}
class Solution {
static boolean[][][][] visited;
static int answer = 0;
public int solution(String dirs) {
visited = new boolean[11][11][11][11];
Position start = new Position(5, 5);
for (int i = 0; i < dirs.length(); i++) {
start = move(start, dirs.charAt(i));
}
return answer;
}
static Position move(Position start, char dir) {
Position next = start.getNextPosition(dir);
// 범위를 벗어나는 경우 이동 x
if (!next.isRanged()) return start;
// 방문 처리
doVisit(start, next);
return next;
}
static void doVisit(Position start, Position next) {
// 방문하지 않은 경우 방문 처리
if(!visited[start.getX()][start.getY()][next.getX()][next.getY()]) {
visited[start.getX()][start.getY()][next.getX()][next.getY()] = true;
visited[next.getX()][next.getY()][start.getX()][start.getY()] = true;
answer++;
}
}
}
'코딩 테스트 > 프로그래머스' 카테고리의 다른 글
프로그래머스 - 괄호 회전하기 문제 (0) | 2021.04.22 |
---|---|
프로그래머스 - 짝지어 제거하기 문제 (자바) (0) | 2021.04.07 |
프로그래머스 - 캐쉬 문제 (자바) (0) | 2021.04.03 |
프로그래머스 - N진수 게임 문제 (자바) (0) | 2021.04.02 |
프로그래머스 - 뉴스 클러스터링 문제 (자바) (0) | 2021.03.31 |