연결된 집의 모임
을 찾아 단지로 정의연결된 집
이라는 것은1
이라는 집을 만나면 내부적으로 그래프 탐색을 시도하여 count 을 증대private static int[] DX = {0, 0, -1, 1};
private static int[] DY = {1, -1, 0, 0};
private static int[][] graph; // 지도
private static int N; // 지도 크기
private static boolean[][] visited; // 지도 방문 내역
Queue<Integer> answers = new PriorityQueue<>();
for (int i = 0; i < N; i++) {
graph[i] = Arrays.stream(br.readLine().split("")) // 한 줄에 대해 String 배열로 받아서 스트림화
.mapToInt(Integer::parseInt) // String 값이기에 전부 Integer 값으로 변경
.toArray(); // 해당 Integer 값을 배열화
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (visited[i][j] == false && graph[i][j] == 1) {
answers.add(bfs(i, j));
}
}
}
visited[i][j] == false
graph[i][j] == 1
1
이여 순회하지 ㅇㅇ int count = 1;
visited[x][y] = true;
Queue<Pair> q = new LinkedList<>();
q.add(new Pair(x, y));
public class LinkedList<E>
extends AbstractSequentialList<E>
implements List<E>, Deque<E>, Cloneable, java.io.Serializable
while (!q.isEmpty()) {
Pair current = q.poll();
int currentX = current.x;
int currentY = current.y;
for (int i = 0; i < 4; i++) {
int nx = currentX + DX[i];
int ny = currentY + DY[i];
if (0 > nx || 0 > ny || nx >= N || ny >= N) {
continue;
}
if (graph[nx][ny] == 0 || visited[nx][ny]) {
continue;
}
q.add(new Pair(nx, ny));
visited[nx][ny] = true;
count++;
}
}
힙 구조
부모 노드가 자식 노드보다 크거나 같은 완전 이진 트리
완전 이진 트리
- 구조
- 모든 레벨이 완전히 채워져 있다 ( 리프 레벨 제외 )
- 리프 노드에서는 왼쪽부터 오른쪽 순서대로 채워진다.
부모 노드의 인덱스가 i 라면
왼쪽 자식노드는 2i
오른쪽 자식노드는 2i + 1
해당 노드에서 부모노드를 찾는 경우 i / 2
라는 공식이 적용된다.
삽입의 경우
3 삽입
8 삽입
2 삽입
5 삽입
10 삽입
poll
하는 경우 항상 우선순위가 높은 값을 뺄 수 있음.poll
을 수행하는 경우에는 어떻게 항상 우선순위가 최대값을 계속적으로 유지할 수 있느냐?poll
이 수행되는 경우 루트 값을 제거한다.5
를 루트로 교체한다.5
는 자식 값중에 큰 값은 8
과 자리를 교체5
는 이후에도 재귀적으로 자식값과 자신을 비교하여 계속적으로 자리를 교체한다.