반응형
문제
게임 캐릭터를 4가지 명령어를 통해 움직이려 합니다. 명령어는 다음과 같습니다.
- U: 위쪽으로 한 칸 가기
- D: 아래쪽으로 한 칸 가기
- R: 오른쪽으로 한 칸 가기
- L: 왼쪽으로 한 칸 가기
캐릭터는 좌표평면의 (0, 0) 위치에서 시작합니다. 좌표평면의 경계는 왼쪽 위(-5, 5), 왼쪽 아래(-5, -5), 오른쪽 위(5, 5), 오른쪽 아래(5, -5)로 이루어져 있습니다.
// 생략
풀이
import java.util.HashSet;
class Solution {
public int solution(String dirs) {
HashSet<String> set = new HashSet<>();
int nowX = 0;
int nowY = 0;
for (char c : dirs.toCharArray()) {
StringBuilder sb = new StringBuilder();
int nextX = nowX;
int nextY = nowY;
if (c == 'U') {
nextY++;
sb.append(nowX);
sb.append(nowY);
sb.append(nextX);
sb.append(nextY);
} else if (c == 'L') {
nextX--;
sb.append(nextX);
sb.append(nextY);
sb.append(nowX);
sb.append(nowY);
} else if (c == 'D') {
nextY--;
sb.append(nextX);
sb.append(nextY);
sb.append(nowX);
sb.append(nowY);
} else if (c == 'R') {
nextX++;
sb.append(nowX);
sb.append(nowY);
sb.append(nextX);
sb.append(nextY);
}
if (nextX < -5 || nextY < -5 || nextX > 5 || nextY > 5) {
continue;
}
set.add(sb.toString());
nowX = nextX;
nowY = nextY;
}
return set.size();
}
}
문제풀이
출발한 좌표에서 이동한 좌표를 String으로 만들어줍니다.
ex) 출발 (0,0) -> 이동 (0,1) ==> "0001"
그리고 이 좌표를 set에 담아줍니다. (중복 제거)
여기서 주의해야할 점은
(0,0) -> (0,1) 과 (0,1) -> (0,0)은 같은 길을 움직인 것으로 처음 걸어본 길에서 제외해야합니다.
if (c == 'U') {
nextY++;
sb.append(nowX);
sb.append(nowY);
sb.append(nextX);
sb.append(nextY);
} else if (c == 'L') {
nextX--;
sb.append(nextX);
sb.append(nextY);
sb.append(nowX);
sb.append(nowY);
} else if (c == 'D') {
nextY--;
sb.append(nextX);
sb.append(nextY);
sb.append(nowX);
sb.append(nowY);
} else if (c == 'R') {
nextX++;
sb.append(nowX);
sb.append(nowY);
sb.append(nextX);
sb.append(nextY);
}
값이 작은 좌표에서 큰 좌표로 이동경로 String을 만들어
(0, 0) -> (0,1) => 0001
(1, 0) -> (0, 0) => 0001 로 같은길일 경우 제외할 수 있도록 만들어줍니다.
반응형
'알고리즘 > 프로그래머스 LV2' 카테고리의 다른 글
[프로그래머스] LV2 가장 큰 수 (0) | 2023.08.26 |
---|---|
[프로그래머스] LV2 다리를 지나는 트럭 (0) | 2023.08.26 |
[프로그래머스] LV2 뉴스 클러스터링 (0) | 2023.08.03 |
[프로그래머스] LV2 기능개발 (0) | 2023.08.01 |
[프로그래머스]LV2 점프와 순간이동 (0) | 2023.07.16 |