https://school.programmers.co.kr/learn/courses/30/lessons/49994
import java.util.*;
class Solution {
public int solution(String dirs) {
Map<Character, int[]> dir = new HashMap<>(){{
put('L', new int[]{0, -1});
put('U', new int[]{-1, 0});
put('D', new int[]{1, 0});
put('R', new int[]{0, 1});
}};
Set<String> visit = new HashSet<>();
char[] cmd = dirs.toCharArray();
int x = 0; int y = 0;
for(char c : cmd){
int nx = x + dir.get(c)[0];
int ny = y + dir.get(c)[1];
if(nx < -5 || ny < -5 || nx > 5|| ny > 5) continue;
StringBuilder tmp = new StringBuilder();
tmp.append(x).append(y).append(nx).append(ny);
visit.add(tmp.toString());
//역방향도 고려
tmp = new StringBuilder();
tmp.append(nx).append(ny).append(x).append(y);
visit.add(tmp.toString());
x = nx; y = ny;
}
return visit.size()/2;
}
}
💡 Map, Set
- 처음에는 1칸의 양 끝점을 필드로 가지는 Edge를 선언해주고, Set을 사용해 중복을 제거하려고 했다
- 하지만 사용자 정의 객체를 set에서 중복 제거하고 싶다면, class에서 별도로 equals, hashCode 메서드 오버라이딩이 필요하다..
- 양 끝점을 굳이 객체로 나타낼 필요가 없음!! ⇒ String으로 (5, 5) -> (4, 5) 면 "5545"와 같이 set에 넣어주면 된다!
- 이때 좌표의 범위는 모두 한자리 숫자이므로 좌표끼리 구분자 넣을 필요는.. 굳이 없음! 어차피 길이 4 고정이니까
- 단, (5,5) - (4, 5) 와 (4, 5) - (5, 5)는 같은 칸이므로 (방향 고려X) 두 경우 모두 고려 해 줘야 한다
'Algorithm > Programmars' 카테고리의 다른 글
[JAVA] 스킬트리- 프로그래머스[Lv.2] (0) | 2024.02.21 |
---|---|
[JAVA] 숫자 변환하기 - 프로그래머스[Lv.2] (0) | 2024.02.15 |
[JAVA] 하노이의 탑 - 프로그래머스[Lv.1] (1) | 2024.02.08 |
[JAVA] 124 나라의 숫자 - 프로그래머스[Lv.2] (0) | 2024.02.06 |
[SQL] 자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기 - 프로그래머스[Lv.3] (1) | 2024.01.31 |