Map
으로 저장 ➡️ get()
으로 편하게 사용하기 위해(0, 0) -> (1, 0)
을 방문했으면 0010
문자열로 저장(1, 0) -> (0, 0)
과 같은 경로이기 때문에 1000
문자열도 저장해야함visited.size() / 2
를 리턴처음에는 좀 복잡하게 풀려고 했다.
visited를 String 리스트로 만들지 않고 Map으로 구현하려고 했다.
만약 (0, 0) -> (1, 0)
을 표현한다고 하면 아래와 같이 구현하려 했다.
[0, 0] -> {{1, 0}, ...}
[1, 0] -> {{0, 0}, ...}
그런데! 하우에버!
맵은 객체를 저장하기 때문에 int배열을 찾고 넣는 것에 애를 먹었다.
HashMap<int[], List<int[]>> visited = new HashMap<>();
// visited에 [0, 0] -> {{1, 0}, ...} 가 저장되어 있다고 가정
int[] from = new int[]{0, 0};
int[] to = new int[]{1, 0};
if (!visited.containsKey(new int[]{0, 0})) {...} // 못찾음
if (!visited.get(new int[]{0, 0}).contains(new int[]{1, 0})) {...} // 못찾음
위 코드에서 두 개의 if 조건이 무조건 true가 된다!
새로운 객체니까 당연히!
이 문제를 해결하기 위해 객체의 값에 접근해서 같으면 true를 반환하는 새로운 메소드를 정의해서 사용하려다가 너무 비효율적인 것 같아서 던졌다! 1시간 삭제! 하하하
visited를 String으로 바꿔서 작성하니까 정말 쉽게 끝났다........
이래서 자료구조 선택하는게 참 중요한 듯^^..
import java.util.*;
public class VisitedLength {
public int solution(String dirs) {
int size = 5;
HashMap<String, int[]> UDRL = new HashMap<>(){};
UDRL.put("U", new int[]{0, 1});
UDRL.put("D", new int[]{0, -1});
UDRL.put("R", new int[]{1, 0});
UDRL.put("L", new int[]{-1, 0});
List<String> visited = new ArrayList<>();
int x = 0;
int y = 0;
for (String direction : dirs.split("")) {
int nx = x + UDRL.get(direction)[0];
int ny = y + UDRL.get(direction)[1];
if (Math.abs(nx) <= size && Math.abs(ny) <= size) {
String from = "" + x + y;
String to = "" + nx + ny;
if (!visited.contains(from + to)) {
visited.add(from + to);
visited.add(to + from);
}
x = nx;
y = ny;
}
}
return visited.size() / 2;
}
public static void main(String[] args) {
VisitedLength visitedLength = new VisitedLength();
System.out.println(visitedLength.solution("ULURRDLLU")); // 7
System.out.println(visitedLength.solution("LULLLLLLU")); // 7
}
}