https://school.programmers.co.kr/learn/courses/30/lessons/49994
import java.util.HashSet;
class Solution {
public int solution(String dirs) {
int answer = 0;
String[] s = dirs.split("");
float[] coordinate = new float[2]; // coordinate[0] = x , coordinate[1] = y
HashSet<String> hashSet = new HashSet<>();
for (String v : s) {
String st = "";
float value = 0;
switch (v) {
case "U" -> {
value = coordinate[1] + 1;
if (value > 5) continue;
coordinate[1] = coordinate[1] + 1;
st = coordinate[0] + String.valueOf(coordinate[1]-0.5);
}
case "D" -> {
value = coordinate[1] - 1;
if (value < -5) continue;
coordinate[1] = coordinate[1] - 1;
st = coordinate[0] + String.valueOf(coordinate[1]+0.5);
}
case "L" -> {
value = coordinate[0] - 1;
if (value < -5) continue;
coordinate[0] = coordinate[0] - 1;
st = String.valueOf(coordinate[0]+0.5) + coordinate[1];
}
case "R" -> {
value = coordinate[0] + 1;
if (value > 5) continue;
coordinate[0] = coordinate[0] + 1;
st = String.valueOf(coordinate[0]-0.5) + coordinate[1];
}
}
hashSet.add(st);
}
answer = hashSet.size();
return answer;
}
}
0, 0에서 UDLR에 따라 방향을 이동하고 처음 걸어본 길의 길이를 구하는 문제.
좌표평면의 경계는 -5, -5 ~ 5, 5로 되어있다.
각각 UDLR인 경우에 먼저 + 또는 - 하여 계산된 값이 경계를 넘어가는지를 판단하고,
넘어가지 않는 경우에 계산을 해준 뒤, 계산된 값은 지나간 길이 아닌 도착한 점이기 때문에 그 중간 지점이 될 곳을 기록하기 위해 +0.5 또는 -0.5를 하여 이것을 String 형태로 HashSet에 저장하여 중복을 피했다.
이렇게 동작하여 나온 HashSet의 길이가 결국 처음 걸어본 길의 길이가 될 것이므로 이것을 정답으로 제출하여 문제를 해결하였다.
좀 더 간결하게 만들 수 있을 것 같다고 생각했지만, switch를 사용한 시점에서 각 경우에 따라 코드를 작성하다 보니 할 수 없게 되었다.
처음에는 HashSet에 String형태가 아닌 배열을 직접 저장하여 문제를 해결하려고 하였으나, 배열이 저장되면, 그 값이 아닌 주소? 가 저장되어 중복을 해결할 수가 없었다.
다른 방법으로 가능할 수도 있기 때문에 좀 더 HashSet에 대해 공부할 필요가 있어 보인다.
'Programmers' 카테고리의 다른 글
[프로그래머스][JAVA]Lv. 3 - 정수 삼각형 (0) | 2023.07.31 |
---|---|
[프로그래머스][JAVA]Lv. 2 - 문자열 압축 (0) | 2023.07.30 |
[프로그래머스][JAVA]Lv. 2 - 스킬트리 (0) | 2023.07.17 |
[프로그래머스][JAVA]Lv. 2 - 타겟 넘버 (0) | 2023.07.09 |
[프로그래머스][JAVA]Lv. 2 - 오픈채팅방 (0) | 2023.07.02 |