๐ ๋ฌธ์ ๋งํฌ
https://www.acmicpc.net/problem/20058
โธ ๋ฌธ์
๋ง๋ฒ์ฌ ์์ด๋ ํ์ด์ด๋ณผ๊ณผ ํ ๋ค์ด๋๋ฅผ ์กฐํฉํด ํ์ด์ด์คํฐ์ ์์ ํ ์ ์๋ค. ์ค๋์ ํ์ด์ด์คํฐ์ ํฌ๊ธฐ๊ฐ 2N × 2N์ธ ๊ฒฉ์๋ก ๋๋์ด์ง ์ผ์ํ์์ ์ฐ์ตํ๋ ค๊ณ ํ๋ค. ์์น (r, c)๋ ๊ฒฉ์์ rํ c์ด์ ์๋ฏธํ๊ณ , A[r][c]๋ (r, c)์ ์๋ ์ผ์์ ์์ ์๋ฏธํ๋ค. A[r][c]๊ฐ 0์ธ ๊ฒฝ์ฐ ์ผ์์ด ์๋ ๊ฒ์ด๋ค.
ํ์ด์ด์คํฐ์ ์์ ํ๋ ค๋ฉด ์์ ํ ๋๋ง๋ค ๋จ๊ณ L์ ๊ฒฐ์ ํด์ผ ํ๋ค. ํ์ด์ด์คํฐ์ ๋จผ์ ๊ฒฉ์๋ฅผ 2L × 2L ํฌ๊ธฐ์ ๋ถ๋ถ ๊ฒฉ์๋ก ๋๋๋ค. ๊ทธ ํ, ๋ชจ๋ ๋ถ๋ถ ๊ฒฉ์๋ฅผ ์๊ณ ๋ฐฉํฅ์ผ๋ก 90๋ ํ์ ์ํจ๋ค. ์ดํ ์ผ์์ด ์๋ ์นธ 3๊ฐ ๋๋ ๊ทธ ์ด์๊ณผ ์ธ์ ํด์์ง ์์ ์นธ์ ์ผ์์ ์์ด 1 ์ค์ด๋ ๋ค. (r, c)์ ์ธ์ ํ ์นธ์ (r-1, c), (r+1, c), (r, c-1), (r, c+1)์ด๋ค. ์๋ ๊ทธ๋ฆผ์ ์นธ์ ์ ํ ์ ์๋ ์นธ์ ๊ตฌ๋ถํ๊ธฐ ์ํด ์ ์ ์ ์์ด๋ค.
๋ง๋ฒ์ฌ ์์ด๋ ํ์ด์ด์คํฐ์ ์ด Q๋ฒ ์์ ํ๋ ค๊ณ ํ๋ค. ๋ชจ๋ ํ์ด์ด์คํฐ์ ์์ ํ ํ, ๋ค์ 2๊ฐ์ง๋ฅผ ๊ตฌํด๋ณด์.
- ๋จ์์๋ ์ผ์ A[r][c]์ ํฉ
- ๋จ์์๋ ์ผ์ ์ค ๊ฐ์ฅ ํฐ ๋ฉ์ด๋ฆฌ๊ฐ ์ฐจ์งํ๋ ์นธ์ ๊ฐ์
์ผ์์ด ์๋ ์นธ์ด ์ผ์์ด ์๋ ์นธ๊ณผ ์ธ์ ํด ์์ผ๋ฉด, ๋ ์นธ์ ์ฐ๊ฒฐ๋์ด ์๋ค๊ณ ํ๋ค. ๋ฉ์ด๋ฆฌ๋ ์ฐ๊ฒฐ๋ ์นธ์ ์งํฉ์ด๋ค.
โธ ์ ๋ ฅ
์ฒซ์งธ ์ค์ N๊ณผ Q๊ฐ ์ฃผ์ด์ง๋ค. ๋์งธ ์ค๋ถํฐ 2N๊ฐ์ ์ค์๋ ๊ฒฉ์์ ๊ฐ ์นธ์ ์๋ ์ผ์์ ์์ด ์ฃผ์ด์ง๋ค. r๋ฒ์งธ ์ค์์ c๋ฒ์งธ ์ฃผ์ด์ง๋ ์ ์๋ A[r][c] ์ด๋ค.
๋ง์ง๋ง ์ค์๋ ๋ง๋ฒ์ฌ ์์ด๊ฐ ์์ ํ ๋จ๊ณ L1, L2, ..., LQ๊ฐ ์์๋๋ก ์ฃผ์ด์ง๋ค.
โธ ์ถ๋ ฅ
์ฒซ์งธ ์ค์ ๋จ์์๋ ์ผ์ A[r][c]์ ํฉ์ ์ถ๋ ฅํ๊ณ , ๋์งธ ์ค์ ๊ฐ์ฅ ํฐ ๋ฉ์ด๋ฆฌ๊ฐ ์ฐจ์งํ๋ ์นธ์ ๊ฐ์๋ฅผ ์ถ๋ ฅํ๋ค. ๋จ, ๋ฉ์ด๋ฆฌ๊ฐ ์์ผ๋ฉด 0์ ์ถ๋ ฅํ๋ค.
โธ ์ ํ
- 2 ≤ N ≤ 6
- 1 ≤ Q ≤ 1,000
- 0 ≤ A[r][c] ≤ 100
- 0 ≤ Li ≤ N
๐ ๋ฌธ์ ์ ๋ณด
- ๐ฅ ๋ฌธ์ ๋ ๋ฒจ : ๊ณจ๋ 3
- ๐ ๋ฌธ์ ์ ํ : ๊ตฌํ, ๊ทธ๋ํ ์ด๋ก , ๊ทธ๋ํ ํ์, ์๋ฎฌ๋ ์ด์ , ๋๋น ์ฐ์ ํ์, ๊น์ด ์ฐ์ ํ์
- ๐ฌ ํ์ด ์ธ์ด : JAVA
๐ค ๋ฌธ์ ํ์ด
ํ์ด์ด์คํฐ์ ์์ ๋จ๊ณ๋ ์๋์ ๊ฐ๋ค.
- ๊ฒฉ์๋ฅผ 2L × 2L ํฌ๊ธฐ์ ๋ถ๋ถ ๊ฒฉ์๋ก ๋๋๋ค.
- ์์ ํ ๋๋ง๋ค ๋จ๊ณ L์ ๊ฒฐ์ ํ๋ค.
- ๋ชจ๋ ๋ถ๋ถ ๊ฒฉ์๋ฅผ ์๊ณ ๋ฐฉํฅ์ผ๋ก 90๋ ํ์ ์ํจ๋ค.
- ์ผ์์ด ์๋ ์นธ 3๊ฐ ๋๋ ๊ทธ ์ด์๊ณผ ์ธ์ ํด์์ง ์์ ์นธ์ ์ผ์์ ์์ด 1 ์ค์ด๋ ๋ค.
- ์ ๊ณผ์ ์ Q ๋งํผ ๋ฐ๋ณตํ๋ค.
๋จผ์ , ๋ถ๋ถ ๊ฒฉ์๋ฅผ ์๊ณ ๋ฐฉํฅ์ผ๋ก 90๋ ํ์ ์ํค๊ธฐ ์ํด ์์๋ฅผ ๋ค์ด๋ณด์.
์๋์ ๊ฐ์ 3 x 3 ํฌ๊ธฐ์ ๋ถ๋ถ ๊ฒฉ์๊ฐ ์๋ค๊ณ ํด๋ณด์.
(0, 0) | (0, 1) | (0, 2) |
(1, 0) | (1, 1) | (1, 2) |
(2, 0) | (2, 1) | (2, 2) |
[ map ]
๊ฒฉ์๋ฅผ ์๊ณ ๋ฐฉํฅ์ผ๋ก 90๋ ํ์ ์ํค๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
(2, 0) | (1, 0) | (0, 0) |
(2, 1) | (1, 1) | (0, 1) |
(2, 2) | (1, 2) | (0, 2) |
[ result ]
๊ฒฐ๊ณผ์ ์ผ๋ก ์๋์ ๊ฐ์ ๊ณต์์ ์ฐพ์ ์ ์๋ค.
result[i][j] = map[n-1-j][i]
์ ๊ท์น์ ์์ฉํด์ ์ฝ๋๋ฅผ ์์ฑํด ๋ณด๋ฉด ์๋์ ๊ฐ๋ค.
private 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;
}
private 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[i+x][j+y] = map[x+l-1-j][y+i];
}
}
}
๋ถ๋ถ ๊ฒฉ์ 90๋ ํ์ ์ ์๋ฃํ๋ค๋ฉด,
์ด์ ๋ชจ๋ ์ผ์ ์นธ ์ฃผ์๋ฅผ ํ์ํ๋ฉฐ ์ธ์ ์ผ์ ์นธ์ด 3๊ฐ ๋ฏธ๋ง์ธ ์นธ์ ์ฐพ์ ์ผ์์ 1 ๋ น์ฌ์ค์ผ ํ๋ค.
์ด๋, ์ฃผ์ํ ์ ์ map ๋ฐฐ์ด์ ์ง์ ์ ์ผ๋ก ๋ณ๊ฒฝํ๋ฉด ์ผ์์ด ์ค์ด๋ ๋ค ์ํ๊ฐ ๋ค๋ฅธ ์นธ์ ์ํฅ์ ์ค ์ ์๋ค.
๊ทธ๋ฌ๋ฏ๋ก tmp ๋ฐฐ์ด์ ์์ฑํด map์ ์ํ๋ฅผ ๋ณต์ฌํ์ฌ ์ผ์์ ๋ น์ธ ๊ฒฐ๊ณผ๋ง ๋ฐ๋ก ์ ์ฅํด๋์๋ค.
private static int[][] melt() {
int[][] tmp = new int[n][n];
for (int i = 0; i < n; i++) {
tmp[i] = Arrays.copyOf(map[i], n); // n์ ๋ณต์ฌ ํ ๊ธธ์ด
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (map[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 && nx < n && ny >= 0 && ny < n) {
if (map[nx][ny] > 0) cnt++;
}
}
if (cnt < 3) tmp[i][j]--; // 3๊ฐ ๋ฏธ๋ง์ด๋ผ๋ฉด ์ผ์ ๋
น์ด๊ธฐ
}
}
return tmp;
}
์ ๊ณผ์ ์ Q ๋งํผ ๋ฐ๋ณตํ ๋ค, ๋จ์์๋ ์ผ์์ ํฉ๊ณผ ๊ฐ์ฅ ํฐ ๋ฉ์ด๋ฆฌ๊ฐ ์ฐจ์งํ๋ ์นธ์ ๊ฐ์๋ฅผ ๊ตฌํ๋ค.
๋๋น ์ฐ์ ํ์(BFS)๋ฅผ ์ฌ์ฉํด ๊ฐ์ฅ ํฐ ๋ฉ์ด๋ฆฌ์ ์นธ ๊ฐ์๋ฅผ ๊ตฌํ๋ฉด์ ๋จ์์๋ ์ผ์์ ํฉ๋ ๊ฐ์ด ๊ตฌํด์คฌ๋ค.
private static void biggest() {
Queue<int[]> que = new LinkedList<>();
boolean[][] checked = new boolean[n][n];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
total += map[i][j]; // ๋จ์์๋ ์ผ์์ ํฉ
if (map[i][j] > 0 && !checked[i][j]) {
que.offer(new int[]{i, j});
checked[i][j] = true;
int cnt = 1; // ํ์ฌ ์์ญ์ ์นธ์ ๊ฐ์
while (!que.isEmpty()) {
int[] now = que.poll();
for (int d = 0; d < 4; d++) {
int nx = now[0] + dx[d];
int ny = now[1] + dy[d];
if (nx >= 0 && nx < n && ny >= 0 && ny < n) {
if (map[nx][ny] > 0 && !checked[nx][ny]) {
que.offer(new int[]{nx, ny});
checked[nx][ny] = true;
cnt++;
}
}
}
}
max = Math.max(max, cnt);
}
}
}
}
์ ํ์ด์ ์ฝ๋๋ฅผ ๋ฐํ์ผ๋ก ์ ์ฒด์ ์ธ ์ฝ๋๋ฅผ ์์ฑํด ๋ณด๋ฉด ์๋์ ๊ฐ๋ค.
โ ์ฝ๋
๋ฉ๋ชจ๋ฆฌ : 64392KB
์๊ฐ : 248ms
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main {
static int n, q;
static int[][] map;
static int[] dx = {-1, 1, 0, 0};
static int[] dy = {0, 0, -1, 1};
static int total, max;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
q = Integer.parseInt(st.nextToken()); // ํ์ด์ด์คํฐ์ ์ด Q๋ฒ ์์
n = (int) Math.pow(2, n);
map = new int[n][n]; // 2N × 2N์ธ ๊ฒฉ์
for (int i = 0; i < n; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < n; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
}
}
int[] l = new int[q]; // ๋ง๋ฒ์ฌ ์์ด๊ฐ ์์ ํ ๋จ๊ณ
st = new StringTokenizer(br.readLine());
for (int i = 0; i < q; i++) {
l[i] = Integer.parseInt(st.nextToken());
}
for (int i = 0; i < q; i++) {
map = divide(l[i]); // ๋ถ๋ถ ๊ฒฉ์ ๋๋๊ธฐ
map = melt(); // ์ธ์ ํ ์ผ์ ์นธ์ด 3๊ฐ ๋ฏธ๋ง์ธ ์นธ ์ฐพ์ ์ผ์ ๋
น์ด๊ธฐ
}
// ๋จ์์๋ ์ผ์์ ํฉ, ๊ฐ์ฅ ํฐ ๋ฉ์ด๋ฆฌ๊ฐ ์ฐจ์งํ๋ ์นธ์ ๊ฐ์
total = max = 0;
biggest();
StringBuilder sb = new StringBuilder();
sb.append(total).append("\n").append(max);
System.out.println(sb.toString());
br.close();
}
private 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); // ์๊ณ ๋ฐฉํฅ์ผ๋ก 90๋ ํ์
}
}
return tmp;
}
private 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[i+x][j+y] = map[x+l-1-j][y+i];
}
}
}
private static int[][] melt() {
int[][] tmp = new int[n][n];
for (int i = 0; i < n; i++) {
tmp[i] = Arrays.copyOf(map[i], n);
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (map[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 && nx < n && ny >= 0 && ny < n) {
if (map[nx][ny] > 0) cnt++;
}
}
if (cnt < 3) tmp[i][j]--; // 3๊ฐ ๋ฏธ๋ง์ด๋ผ๋ฉด ์ผ์ ๋
น์ด๊ธฐ
}
}
return tmp;
}
private static void biggest() {
Queue<int[]> que = new LinkedList<>();
boolean[][] checked = new boolean[n][n];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
total += map[i][j]; // ๋จ์์๋ ์ผ์์ ํฉ
if (map[i][j] > 0 && !checked[i][j]) {
que.offer(new int[]{i, j});
checked[i][j] = true;
int cnt = 1; // ํ์ฌ ์์ญ์ ์นธ์ ๊ฐ์
while (!que.isEmpty()) {
int[] now = que.poll();
for (int d = 0; d < 4; d++) {
int nx = now[0] + dx[d];
int ny = now[1] + dy[d];
if (nx >= 0 && nx < n && ny >= 0 && ny < n) {
if (map[nx][ny] > 0 && !checked[nx][ny]) {
que.offer(new int[]{nx, ny});
checked[nx][ny] = true;
cnt++;
}
}
}
}
max = Math.max(max, cnt);
}
}
}
}
}
๋ฌธ์ ๋ฅผ ํ๋ฉด์ ๋ชจ๋ ๋ถ๋ถ ๊ฒฉ์๋ฅผ ์๊ณ ๋ฐฉํฅ์ผ๋ก 90๋ ํ์ ํ๋ ๋ถ๋ถ ๋๋ฌธ์ ๊ฝค๋ ์ ๋ฅผ ๋จน์๋ค.
๊ฑฐ๊ธฐ๋ค ๋ฌธ์ ๋ฅผ ์๋ชป ์ฝ์ด ๋ฌธ์ ์ ๋์จ ์์๋ฅผ ์ดํดํ๋ ๋ฐ์๋ ๋ง์ ์๊ฐ์ ์๋ชจํ๋ค.
๋ฌธ์ ๋ฅผ ์ข ๋ ๊ผผ๊ผผํ ์ฝ๋ ์ต๊ด๊ณผ ๊ตฌํ ๋ฌธ์ ๋ฅผ ๋ ๋ง์ด ํ์ด๋ด์ผ ํ ๊ฒ ๊ฐ๋ค...โญ
'Algorithm > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Boj_17244] ์๋ง๋ค์ฐ์ฐ (1) | 2025.07.16 |
---|---|
[Boj_15787] ๊ธฐ์ฐจ๊ฐ ์ด๋ ์ ํค์น๊ณ ์ํ์๋ฅผ (1) | 2025.07.03 |
[Boj_1263] ์๊ฐ ๊ด๋ฆฌ (0) | 2025.05.11 |
[Boj_17485] ์ง์ฐ์ ๋ฌ ์ฌํ (Large) (0) | 2025.04.24 |
[Boj_15980] ๋ช ์ ๋ฐฉํด๊พผ (0) | 2025.04.16 |