Closed yeahdy closed 1 month ago
🤔 시간복잡도 고려사항
💡 풀이 아이디어
1. 검사하기: 이동이 필요한 계란들이 존재하는지 여부 체크
2. 합칠 계란 덩어리들 구하기: bfs 탐색으로 서로 합쳐져야 하는 계란리스트 구하기
3. 합치기
🤔 시간복잡도 고려사항
💡 풀이 아이디어
visited배열
)(해당 영역의 모든 계란 합 / 해당 영역의 계란 수)
반환bfs 결과값
이 현재 계란영역 값
(board[i][j])와 같으면 이동이 일어나지 않은 것flag==N*N
, 모든 영역이 이동이 일어나지 않으면 탈출board[i][j] = split[visited[i][j]];
무한루프 탈출 조건을 잘 설정하자!
🤔 시간복잡도 고려사항
n<= 50, n*n = 250
BFS
O(N^2)
로 구현
💡 풀이 아이디어
BFS
조건 확인 후 그룹 형성
:L <= 두 계란 틀 <= R
조건을 만족하는 계란들을 BFS
로 묶음계란 합, 평균 계산
: 조건을 만족하는 인접한 계란 양의 합을 구하고 change() 함수
를 통해 그룹 내 계란 틀의 계란 양을 평균값으로 재설정
계란 양 재설정
: ArrayList에 저장된 모든 계란틀에 계산한 평균값
업데이트 -> 계란 이동
처리★ 지난주 주신 피드백 반영 1) 좌표 row, column으로 설정 (오른쪽, 아래, 왼쪽, 위)
static int[] dr = {0, 1, 0, -1}; // 행(row)
static int[] dc = {1, 0, -1, 0}; // 열(column)
2) 좌표 class로 설정
public static class Node {
int r, c;
public Node(int r, int c) {
this.r = r;
this.c = c;
}
}
3) isRange 함수로 범위 체크
private static boolean isRange(int r, int c) { // 배열의 범위를 벗어나지 않는지 확인
return r >= 0 && r < n && c >= 0 && c < n;
}
Node Class 설정하는게 낯설고 어려웠습니다
🤔 시간복잡도 고려사항
BFS(50 × 100 × 4) × 2000 < 1억 이므로 주어진대로 구현해도 됨
💡 풀이 아이디어
BFS를 통해 상, 하, 좌, 우 계란선이 분리될 수 있는지 확인 분리 이후 다시 계란틀의 계란양이 업데이트 되야하므로 BFS에 사용할 큐 외에 따로 좌표를 저장할 큐가 필요
ArrayDeque<Point> q
: BFS를 할 때 사용할 큐ArrayDeque<Point> tmp
: 방문한 계란틀의 위치 저장할 큐int cnt
: 계란틀의 총 개수int sum
: 합쳐진 계란의 총 합boolean flag
: 분리될 수 있는 계란선이 있는지 확인하는 변수- BFS를 통해 두 계란틀의 계란 차이가 L이상 R이하가 되는지 확인
- 조건 만족한다면
tmp
에 위치 저장cnt
와sum
업데이트- BFS가 끝나면
tmp
큐가 빌 때까지 반복하면서 방문했던 계란틀의 위치의 값을sum / cnt
로 업데이트
🤔 시간복잡도 고려사항
💡 풀이 아이디어
BFS
진행 방향의 좌표만 확인
하면 됨 (우, 하)ArrayList
에 넣어 BFS가 끝난 후 역 추적 하여 계산된 값을 할당
🤔 시간복잡도 고려사항
💡 풀이 아이디어