📖 오늘의 학습 키워드
그래프
[방의 개수]
https://school.programmers.co.kr/learn/courses/30/lessons/49190
import java.util.*;
public class Solution {
public int[][] directions = {{-1, 0}, {-1, 1}, {0, 1}, {1, 1}, {1, 0}, {1, -1}, {0, -1}, {-1, -1}};
public int solution(int[] arrows) {
int answer = 0;
Map<String, Vertex> vertices = new HashMap<>();
Vertex now = new Vertex(0, 0);
vertices.put(now.id, now);
for (int idx : arrows) {
for (int i = 0; i < 2; i++) {
int x = now.x + directions[idx][1];
int y = now.y + directions[idx][0];
String id = Vertex.id(x, y);
if (!vertices.containsKey(id)) {
vertices.put(id, new Vertex(x, y));
} else if (!now.connectedvertices.contains(id)) {
answer++;
}
Vertex next = vertices.get(id);
now.connectedvertices.add(next.id);
next.connectedvertices.add(now.id);
now = vertices.get(id);
}
}
return answer;
}
public static class Vertex {
public int x;
public int y;
public String id;
public Set<String> connectedvertices;
public Vertex(int x, int y) {
this.x = x;
this.y = y;
this.id = id(x, y);
this.connectedvertices = new HashSet<>();
}
public static String id(int x, int y) {
return String.format("(%d, %d)", x, y);
}
}
}
이차원 배열 directions에 아래 그림 속 숫자 순서로 이동 방향을 저장한다.
Vertex 클래스는 방문한 정점의 정보를 담는다.
방문한 정점과 그 정점의 정보를 관리하는 Map vertices를 생성한다.
now는 현재 정점
arrows 배열을 순회하며 정점의 이동을 표현한다.
1) 이동에 따라 x, y 값을 갱신하고 그 값을 id에 저장한다.
2) vertices에 id 값이 없으면 처음 방문한 값이므로 새로운 Vertex를 생성하고 이 값을 vertices에 추가한다.
3) 해당 정점을 재방문했으나 직전 정점과의 간선이 처음 만들어졌다면 방이 새로 만들어진 것이므로 answer에 값을 하나 늘린다.
4) 현재 정점과 다음 정점을 연결한 간선 정보를 저장한다.
5) 현재 정점 now를 다음 정점 next로 갱신한다.
6) for (int i = 0; i < 2; i++)가 필요한 이유
이번 문제는 혼자 힘으로 풀지 못하고 풀이를 찾아보고 겨우 풀었던 것 같다. 아직은 그래프를 표현하는 부분이 익숙하지 않은 것 같다. 그리고 교차점이 발생해 생기는 예외 케이스를 직접 찾아내는 것 또한 쉽지 않은 것 같다. 앞으로 그래프 문제들을 더 많이 풀어보아야겠다.