https://school.programmers.co.kr/learn/courses/30/lessons/49994
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 설명
게임 캐릭터를 4가지 명령어를 통해 움직이려 합니다. 명령어는 다음과 같습니다.
- U : 위쪽으로 한 칸 가기
- D : 아래쪽으로 한 칸 가기
- R : 오른쪽으로 한 칸 가기
- L : 왼쪽으로 한 칸 가기
캐릭터는 좌표평면의 (0, 0) 위치에서 시작합니다. 좌표평면의 경계는 왼쪽 위 (-5, 5), 왼쪽 아래(-5, -5), 오른쪽 위(5, 5), 오른쪽 아래(5, -5)로 이루어져 있습니다.
예를 들어, "ULURRDLLU"로 명령했다면


이때, 우리는 게임 캐릭터가 지나간 길 중 캐릭터가 처음 걸어본 길의 길이를 구하려고 합니다.
💡 풀이 과정
1. 일단 위치 볼 때 -를 고려하지 않기 위해서 (0,0) 위치를 옮겨 (0,0) ~ (10,10)를 범위로 바꿔줍니다.
그럼 시작 위치 또한 (5,5)로 변경됩니다.
2. 처음 걸어본 길인지를 확인하기 위해 사분면의 점 위치를 나타내는 boolean 배열을 만들어줍니다.
boolean[][] visited
여기서 길을 방문했는지를 저장하기 위해 점의 네 방향을 확인할 수 있도록 3차원 배열로 만들어 줍니다.
//해당 점의 상하좌우 방문 확인
boolean[][][] wayVisited = new boolean[11][11][4];
// 0:상 1:하 2:우 3:좌
3. 처음 위치에서 시작해, dirs를 수행했을 때의 위치가 0~10을 벗어나지 않으면 dirs를 하나씩 수행합니다.
4. 만약 방향이 'U'가 들어오고, 현재 위치에서 윗길을 방문한 적이 없으면,
answer+1 해주고 현재 위치(x,y)의 윗길을 방문처리 해줍니다. [x][y][0]=true;
또한 이동한 지점의 아랫길도 방문 처리를 해줍니다. [x][y+1][1]=true;
그리고 방문한적이 있든 없든 현재 위치를 이동시켜 줍니다. y++;
if(dir=='U' && y+1<=10){
if(!wayVisited[x][y][0]){ //윗길 방문 한적 없으면
answer++;
wayVisited[x][y][0]=true;//(x,y)의 윗길 방문 처리
wayVisited[x][y+1][1]=true; //(x,y+1) 아랫길 방문 처리
}
y++;
}
5. 4번 작업을 방향이 'D', 'R', 'L'일 때도 동일하게 처리합니다.
6. 모든 dirs를 처리해 준 뒤, 저장된 answer를 return 합니다.
전체 코드
class Solution {
public int solution(String dirs) {
int answer = 0;
//- 생각하지 않으려고 사분면 위치를 이동시켜서 (0,0)~(10,10)까지로 범위 변경.
boolean[][][] wayVisited = new boolean[11][11][4]; // 해당 점의 상하좌우 방문 확인.
int x=5;//처음 위치
int y=5;
for(int i=0;i<dirs.length();i++){
int dir=dirs.charAt(i);//방향
//System.out.print("("+x+","+y+") ->");
if(dir=='U' && y+1<=10){
if(!wayVisited[x][y][0]){ //윗길 방문 한적 없으면
answer++;
wayVisited[x][y][0]=true;//(x,y)의 윗길 방문 처리
wayVisited[x][y+1][1]=true; //(x,y+1) 아랫길 방문 처리
}
y++;
}else if(dir=='D' && y-1>=0){
if(!wayVisited[x][y][1]){//아랫길 방문 한적 없으면
answer++;
wayVisited[x][y][1]=true;//(x,y) 아랫길 방문 처리
wayVisited[x][y-1][0]=true;//(x,y-1) 윗길 방문 처리
}
y--;
}else if(dir=='R' && x+1<=10){
if(!wayVisited[x][y][2]){//오른쪽길 방문 한적 없으면
answer++;
wayVisited[x][y][2]=true;//(x,y) 오른쪽 방문 처리
wayVisited[x+1][y][3]=true;//(x+1,y) 왼쪽 방문 처리
}
x++;
}else if(dir=='L' && x-1>=0){
if(!wayVisited[x][y][3]){//왼쪽 방문 한적 없으면
answer++;
wayVisited[x][y][3]=true;//(x,y) 왼쪽 방문 처리
wayVisited[x-1][y][2]=true; //(x-1,y) 오른쪽 방문 처리
}
x--;
}
//System.out.println(" ("+x+","+y+") : "+answer);
}
return answer;
}
}'Algorithms(CT) > Programmers' 카테고리의 다른 글
| [프로그래머스]Lv2. 파일명 정렬 (Java) (0) | 2023.06.29 |
|---|---|
| [프로그래머스] Lv.2 스킬트리 (0) | 2023.06.29 |
| [프로그래머스] Lv.2 땅따먹기 (Java) (0) | 2023.06.29 |
| [프로그래머스] Lv.3 순위 (Java) (0) | 2023.06.27 |
| [프로그래머스] Lv.4 징검다리 (Java) (0) | 2023.06.26 |
