💡 코드 작성시 목표는 다음과 같습니다.
- 시간복잡도를 고려한 효율적인 알고리즘
- 공간복잡도를 고려한 효율적인 메모리 관리
- 운영을 위한 단순하고 가독성 높은 코드 작성
- 다른 개발자에게 안내하기 위한 충분한 주석
- 해당 문제 외에도 적용할 수 있는 범용성 있는 논리
- 코딩테스트에서도 활용할 수 있을 만큼 간결한 코드
원점(0,0)에서 시작해서 아래처럼 숫자가 적힌 방향으로 이동하며 선을 긋습니다.

ex) 1일때는 오른쪽 위로 이동
그림을 그릴 때, 사방이 막히면 방하나로 샙니다.
이동하는 방향이 담긴 배열 arrows가 매개변수로 주어질 때, 방의 갯수를 return 하도록 solution 함수를 작성하세요.
| arrows | return |
|---|---|
| [6, 6, 6, 4, 4, 4, 2, 2, 2, 0, 0, 0, 1, 6, 5, 5, 3, 6, 0] | 3 |

다음과 같은 조건들을 고려해야 한다.
기본적인 조건은 위와 같은데, 실제로 문제를 풀었을 때는 아래와 같이 생각할 부분이 많았다.
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Objects;
class Solution {
static class Pair {
public int x;
public int y;
public Pair(int x, int y) {
this.x = x;
this.y = y;
}
public int hashCode() {
return Objects.hash(x,y);
}
public boolean equals(Object o) {
return this.x == ((Pair) o).x && this.y == ((Pair) o).y;
}
}
public static int solution(int[] arrows) {
// 변수 선언
int cnt = 0;
// 방향 관련 배열 선언
Pair pointHC = new Pair(0, 0);
int[] dx = { 0, 1, 1, 1, 0, -1, -1, -1 };
int[] dy = { 1, 1, 0, -1, -1, -1, 0, 1 };
// 방문 여부 관련 선언
// key = 시작 node의 hashcode, value = 연결된 node들의 hashcode
HashMap<Pair, ArrayList<Pair>> visitied = new HashMap<>();
// 로직 처리
for (int arrow : arrows) {
for (int i = 0; i <= 1; i++) { // 교차점 처리를 위한 스케일업(반복 2번)
// 이동 진행
Pair newPointHC = new Pair(pointHC.x + dx[arrow], pointHC.y + dy[arrow]);
// 처음 방문하는 경우 = map에 키값이 없는 경우
if (!visitied.containsKey(newPointHC)) {
// 리스트에 연결점 추가
visitied.put(newPointHC, makeEdgeList(pointHC));
if(visitied.get(pointHC) == null) { // 기존점도 없다면 업데이트
visitied.put(pointHC, makeEdgeList(newPointHC));
} else { // 기존점이 있다면 추가하기
visitied.get(pointHC).add(newPointHC);
}
// 재방문했고 간선을 처음 통과하는 경우
} else if (visitied.containsKey(newPointHC) && !(visitied.get(newPointHC).contains(pointHC))) {
visitied.get(newPointHC).add(pointHC);
visitied.get(pointHC).add(newPointHC);
cnt++;
}
// 이동 완료
pointHC = newPointHC;
}
}
return cnt;
}
// 밸류값에 넣기 위한 리스트 만들기
public static ArrayList<Pair> makeEdgeList(Pair pointHC) {
ArrayList<Pair> edge = new ArrayList<>();
edge.add(pointHC);
return edge;
}
}