β¨ BFS + ꡬν β λΆλΆ 격μλ₯Ό μκ³λ°©ν₯μΌλ‘ 90λ νμ
https://www.acmicpc.net/problem/20058
20058λ²: λ§λ²μ¬ μμ΄μ νμ΄μ΄μ€ν°
λ§λ²μ¬ μμ΄λ νμ΄μ΄λ³Όκ³Ό ν λ€μ΄λλ₯Ό μ‘°ν©ν΄ νμ΄μ΄μ€ν°μ μμ ν μ μλ€. μ€λμ νμ΄μ΄μ€ν°μ ν¬κΈ°κ° 2N × 2NμΈ κ²©μλ‘ λλμ΄μ§ μΌμνμμ μ°μ΅νλ €κ³ νλ€. μμΉ (r, c)λ 격μμ rν c
www.acmicpc.net
π κ³ λ €ν΄μΌν μ
- 2^L * 2^L ν¬κΈ°μ λΆλΆ 격μλ‘ λλκ³ λͺ¨λ λΆλΆ 격μλ₯Ό μκ³λ°©ν₯μΌλ‘ 90λ νμ

- L=1μΌ λ, 2x2μ λΆλΆκ²©μκ° μκ³λ°©ν₯μΌλ‘ 90λ νμ
- L=2μΌ λ, 4x4μ λΆλΆκ²©μκ° μκ³λ°©ν₯μΌλ‘ 90λ νμ
- (x, y)μΉΈμμ μΈμ ν μΉΈ(μνμ’μ°) μ€ μΌμμ΄ μλ μΉΈμ΄ 3κ° λ―Έλ§μ΄λ©΄ (x, y)μΉΈ μΌμμ μ 1 κ°μ
- λ¨μμλ μΌμ μ€ κ°μ₯ ν° λ©μ΄λ¦¬κ° μ°¨μ§νλ μΉΈμ κ°μ ꡬνκΈ° π BFS
πΉοΈ νμ΄κ³Όμ
λ€λ₯Έ 쑰건λ€μ 무λνμΌλ λΆλΆ 격μλ₯Ό μκ³λ°©ν₯μΌλ‘ 90λ νμ νλ κ²μ μ‘°κΈ κΉλ€λ‘μ λ€.
μ°μ λ©μλλ₯Ό λ€μκ³Ό κ°μ΄ λλλ€.
simulate()
- νμμ λ©μλλ₯Ό Qλ² λ°λ³΅νμ¬ μ€ν = λ§λ² μμ
rotate()
- λΆλΆκ²©μλ₯Ό μκ³λ°©ν₯μΌλ‘ 90λ νμ
melting()
- μΈμ νλ μΉΈ μ€ μΌμμ΄ μλ μΉΈμ΄ 3κ° λ―Έλ§μ΄λ©΄ μΌμ 1 κ°μ
getTotal()
- λ¨μμλ μΌμ ν© κ΅¬νκΈ°
getMass()
- λ¨μμλ μΌμ λ©μ΄λ¦¬ μ€ κ°μ₯ ν° λ©μ΄λ¦¬ ꡬνκΈ°
bfs()
- μΌμ λ©μ΄λ¦¬ ꡬνλλ° νμν bfs ν¨μ
copy()
- μΌμμ 1 κ°μμν¨ ν ν΄λΉνλ κ²°κ³Όκ°μ μλ λ°°μ΄μ λ°μν¨μΌλ‘μ¨ λ€μμ μμ ν λ¨κ³ μ€λΉ
μ΄ ν¨μλ€ μ€μμ rotate()
κ³Ό melting()
λ©μλλ₯Ό μ΄ν΄λ³΄κ² λ€.
πΉ rotate()
π λ΄κ° μ§ μ½λ
static void rotate(int l){
newA = new int[n][n];
int[][] temp;
int[][] newTemp;
// l = 2^L
for (int x = 0; x < n; x += l) {
for (int y = 0; y < n; y += l) {
temp = new int[l][l];
newTemp = new int[l][l];
for (int i = x; i < x + l; i++) {
for (int j = y; j < y + l; j++) {
temp[i-x][j-y] = A[i][j];
}
}
// μκ³λ°©ν₯μΌλ‘ 90λ νμ
for (int i = 0; i < l; i++) {
for (int j = 0; j < l; j++) {
newTemp[i][j] = temp[(l - 1) - j][i];
}
}
for (int i = x; i < x + l; i++) {
for (int j = y; j < y + l; j++) {
newA[i][j] = newTemp[i-x][j-y];
}
}
}
}
}
λ€μ 볡μ‘νκ² μ½λλ₯Ό μμ±νλ€...
λμ μλλ μλ κ·Έλ¦Όμ²λΌ λΆλΆκ²©μλ₯Ό μμ λΌμ΄λκ³ μκ°ν΄μ λ€μ λ°μμν€λ λ°©λ²μ΄λ€.
μ€κ°μ 90λλ‘ νμ μν€λ μκ³ λ¦¬μ¦μ μμ΄μ€νκ΅ λ¬Έμ μμ μ§ννλ λμΌν λ°©λ²μΌλ‘ μμ±νλ€. (λ¨μ§ μκ³λ°©ν₯μΌλ‘λ§ λ°κΏμ€¬μ λΏ!)
πΈ rotate()
π μ¬μ΄ μ½λ
public static int[][] divide(int L) {
int[][] tmp = new int[n][n];
L = (int) Math.pow(2, L);
for (int i = 0; i < n; i += L) {
for (int j = 0; j < n; j += L) {
rotate(i, j, L, tmp);
}
}
return tmp;
}
public static void rotate(int x, int y, int L, int[][] tmp) {
for (int i = 0; i < L; i++) {
for (int j = 0; j < L; j++) {
tmp[x + i][y + j] = map[x + L - 1 - j][y + i];
}
}
}
πΉ melting()
static void melting(){
Queue<Info> meltingIce = new LinkedList<>();
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if(newA[i][j]==0) continue;
int cnt=0;
for (int d = 0; d < 4; d++) {
int nx = i + dx[d];
int ny = j + dy[d];
if(nx>=0 && ny>=0 && nx<n && ny<n && newA[nx][ny]!=0) cnt++;
}
if(cnt<3) meltingIce.add(new Info(i, j));
}
}
while (!meltingIce.isEmpty()) {
Info now = meltingIce.poll();
newA[now.x][now.y]--;
}
}
λ€λ₯Έ μΉΈλ€λ νμν΄μΌνκΈ° λλ¬Έμ μΌμμ΄ 1 κ°μνλ κ²μ λ°λ‘ λ°μμν€λ©΄ μλλ€.
κ·Έλ¬λ―λ‘ 1 κ°μμμΌμΌνλ μΉΈλ€μ λ°λ‘ Queueμ μ μ₯ν΄μ£Όμκ³ , λͺ¨λ μΉΈλ€μ νμν ν Queueμ μλ μ’νλ€μ νλμ© κΊΌλ΄μ΄ 1 κ°μμν΄μΌλ‘μ¨ νκΊΌλ²μ λ°μμμΌ°λ€.
π©π» μ 체 μ½λ
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class BOJ_20058_λ§λ²μ¬μμ΄μνμ΄μ΄μ€ν° {
static int N, Q, n, maxMass=0;
static int[] L;
static int[][] A;
static int[][] newA;
static boolean[][] visit;
static int[] dx = {0, 0, 1, -1};
static int[] dy = {1, -1, 0, 0};
static class Info{
int x, y;
public Info(int x, int y) {
this.x=x;
this.y=y;
}
}
// λ§λ² μμ
static void simulate(){
for (int i = 0; i < Q; i++) {
// #1. λΆλΆ 격μλ₯Ό μκ³ λ°©ν₯μΌλ‘ 90λ νμ
int l = (int) Math.pow(2, L[i]);
rotate(l);
// #2. μΈμ ν μΉΈ μ€ μΌμμ΄ μλ μΉΈμ΄ 3κ° λ―Έλ§μ΄λ©΄ ν΄λΉνλ μΉΈ μΌμμ μ 1 κ°μ
melting();
copy();
// ==> Qλ² μμ
}
System.out.println(getTotal());
System.out.println(getMass());
}
// λΆλΆ 격μλ‘ λλκ³ λͺ¨λ λΆλΆ 격μλ₯Ό μκ³λ°©ν₯μΌλ‘ 90λ νμ
static void rotate(int l){
newA = new int[n][n];
int[][] temp;
int[][] newTemp;
for (int x = 0; x < n; x += l) {
for (int y = 0; y < n; y += l) {
temp = new int[l][l];
newTemp = new int[l][l];
for (int i = x; i < x + l; i++) {
for (int j = y; j < y + l; j++) {
temp[i-x][j-y] = A[i][j];
}
}
for (int i = 0; i < l; i++) {
for (int j = 0; j < l; j++) {
newTemp[i][j] = temp[(l - 1) - j][i];
}
}
for (int i = x; i < x + l; i++) {
for (int j = y; j < y + l; j++) {
newA[i][j] = newTemp[i-x][j-y];
}
}
}
}
}
// μΌμμ΄ μλ μΉΈ 3κ° λλ κ·Έ μ΄μκ³Ό μΈμ ν΄ μμ§ μμ μΉΈ = μΈμ ν μΉΈ μ€ μΌμμ΄ μλ μΉΈμ΄ 3κ° λ―Έλ§--> μΌμμ μ 1 κ°μ
static void melting(){
Queue<Info> meltingIce = new LinkedList<>();
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if(newA[i][j]==0) continue;
int cnt=0;
for (int d = 0; d < 4; d++) {
int nx = i + dx[d];
int ny = j + dy[d];
if(nx>=0 && ny>=0 && nx<n && ny<n && newA[nx][ny]!=0) cnt++;
}
if(cnt<3) meltingIce.add(new Info(i, j));
}
}
while (!meltingIce.isEmpty()) {
Info now = meltingIce.poll();
newA[now.x][now.y]--;
}
}
// λ¨μμλ μΌμ A[r][c]μ ν©
static int getTotal(){
int total = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if(A[i][j]!=0) total+=A[i][j];
}
}
return total;
}
// λ¨μμλ μΌμ μ€ κ°μ₯ ν° λ©μ΄λ¦¬κ° μ°¨μ§νλ μΉΈμ κ°μ --> BFS
static int getMass(){
visit = new boolean[n][n];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (!visit[i][j] && A[i][j] != 0) {
bfs(i, j);
}
}
}
return maxMass;
}
static void bfs(int x, int y){
Queue<Info> queue = new LinkedList<>();
queue.add(new Info(x, y));
visit[x][y]=true;
int cnt=1;
while (!queue.isEmpty()) {
Info now = queue.poll();
for (int i = 0; i < 4; i++) {
int nx = now.x + dx[i];
int ny = now.y + dy[i];
if (nx >= 0 && ny >= 0 && nx < n && ny < n && !visit[nx][ny]) {
if (newA[nx][ny] != 0) {
visit[nx][ny] = true;
queue.add(new Info(nx, ny));
cnt++;
}
}
}
}
maxMass = Math.max(maxMass, cnt);
}
static void copy(){
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
A[i][j] = newA[i][j];
}
}
}
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
Q = Integer.parseInt(st.nextToken());
n = (int) Math.pow(2, N);
A = new int[n][n];
L = new int[Q];
for (int i = 0; i < n; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < n; j++) {
A[i][j] = Integer.parseInt(st.nextToken());
}
}
st = new StringTokenizer(br.readLine());
for (int i = 0; i < Q; i++) {
L[i] = Integer.parseInt(st.nextToken());
}
simulate();
}
}
'μκ³ λ¦¬μ¦ > BOJ' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[BOJ] 17837 μλ‘μ΄ κ²μ2 - Java (0) | 2024.03.19 |
---|---|
[BOJ] 17485 μ§μ°μ λ¬ μ¬ν (Large) - Java (0) | 2024.03.12 |
[BOJ] 21609 μμ΄ μ€νκ΅ - Java (0) | 2024.02.26 |
[BOJ] 1018 체μ€ν λ€μ μΉ νκΈ° - Java (0) | 2023.12.05 |
[BOJ] 1504 νΉμ ν μ΅λ¨ κ²½λ‘ - Java (0) | 2023.12.05 |