💡 코드 작성시 목표는 다음과 같습니다.
- 시간복잡도를 고려한 효율적인 알고리즘
- 공간복잡도를 고려한 효율적인 메모리 관리
- 운영을 위한 단순하고 가독성 높은 코드 작성
- 다른 개발자에게 안내하기 위한 충분한 주석
- 해당 문제 외에도 적용할 수 있는 범용성 있는 논리
- 코딩테스트에서도 활용할 수 있을 만큼 간결한 코드
원점(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;
}
}