https://programmers.co.kr/learn/courses/30/lessons/49994?language=java
코딩테스트 연습 - 방문 길이
programmers.co.kr
사실 이 문제는 예전에 좀 봤다가 못 풀었다. 그래서 구글링의 도움을 좀 받았다. 결과적으로 예외케이스에 대한 처리를 못해줘서 통과가 안됬었다.
문제 설명에 그림이 많아서 되게 길어보이지만 사실 어렵진 않은 문제였다. 결국 경로의 길이를 구하는 건데 시작 좌표와 도착 좌표를 동시에 생각하는 게 포인트였던 것 같다.
1. 명령어를 U, D, R, L 4가지로 나눠서 좌표를 각 명령어에 맞게 움직인다.
2. 움직이기 전 좌표 A(y1, x1)과 움직인 후 좌표 B(y2, x2)를 선택해 모두 HashSet에 넣는다.
2-1. 이 때 A에서 B로 움직인 경로나 B에서 A로 움직인 경로는 결과적으로 같은 길이기 때문에 중복에 대한 처리가 필요하다.
2-2. 따라서 A+B, B+A꼴로 HashSet에 넣어서 중복처리를 해준다.
3. 예외적으로, 움직이고 나서도 A와 B의 좌표가 같다면 넘어가서 다음 명령어를 처리한다.
문제
제한사항 및 입출력 예시
코드
import java.util.HashSet;
class Solution
{
public int solution(String dirs)
{
// 각각 이동 전 좌표와 이동 후 좌표 (x, y)
int nowY = 0;
int nowX = 0;
int y = 0;
int x = 0;
// HashSet 선언 (중복 자동제거)
HashSet<String> set = new HashSet<String>();
for(int i=0; i<dirs.length(); i++)
{
y = nowY;
x = nowX;
if(dirs.charAt(i)=='U' && y<=4) // ↑ 방향으로 움직일 때
{
nowY++;
}
if(dirs.charAt(i)=='D' && y>=-4) // ↓방향으로 움직일 때
{
nowY--;
}
if(dirs.charAt(i)=='L' && nowX>=-4) // ←방향으로 움직일 때
{
nowX--;
}
if(dirs.charAt(i)=='R' && nowX<=4) // →방향으로 움직일 때
{
nowX++;
}
if(x==nowX && y==nowY) // 움직이지 않을 때(예외처리)
{
continue;
}
// 이동 전 좌표와 이동 후 좌표를 모두 엮어서 set에 삽입
String OldToNew = y + "" + x + "" + nowY + "" + nowX + "";
String NewToOld = nowY + "" + nowX + "" + y + "" + x + "";
set.add(OldToNew);
set.add(NewToOld);
}
// 좌표 2개를 모두 넣어줬기 때문에 /2 후 결과 리턴
return set.size()/2;
}
}
'[ 다먹살 ] > - Coding' 카테고리의 다른 글
[구름] 레벨2 두 점 사이의 거리 (0) | 2021.08.27 |
---|---|
[구름] 레벨1 Min함수, 윤년 (2) | 2021.08.25 |
[프로그래머스] 위클리챌린지 4주 직업군 추천하기 (2) | 2021.08.23 |
[프로그래머스] 레벨2 튜플 (0) | 2021.08.23 |
[프로그래머스] 레벨2 가장 큰 정사각형 (0) | 2021.08.19 |
댓글