Tags
- ์๋ฃ๊ตฌ์กฐ
- ๊ทธ๋ํ ํ์
- dfs
- Brute Force Algorithm
- Java
- ๊ทธ๋ํ ์ด๋ก
- DP
- Study
- PGM
- Python
- ์๋ฎฌ๋ ์ด์
- ๋ฌธ์์ด
- LV2
- stack
- ์ํ
- Dynamic Programming
- BOJ
- ๊น์ด ์ฐ์ ํ์
- BFS
- ์ ์๋ก
- ๊ตฌํ
- CodingTest
- sort
- queue
- SpringBoot
- ๋ฐฑํธ๋ํน
- ๋๋น ์ฐ์ ํ์
- ์ ๋ ฌ
- ๊ต์ฌ
- greedy
Archives
๊ธฐ๋ก๋ฐฉ
BOJ_1915 : ๊ฐ์ฅ ํฐ ์ ์ฌ๊ฐํ ๋ณธ๋ฌธ
๐ธ ๋ฌธ์ ๋ถ์ ๐ธ
- n * m ๋ฐฐ์ด์์ 1๋ก ์ด๋ฃจ์ด์ง ๊ฐ์ฅ ํฐ ์ ์ฌ๊ฐํ์ ๋์ด๋ฅผ ์ถ๋ ฅํ๋ค.
๐ธ ๋ฌธ์ ํ์ด ๐ธ
- ๋จผ์ Brute Force๋ก ํ์ด ์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ณ์ฐํด ๋ณด์๋ค.
- ์ ์ฌ๊ฐํ์ ์ค๋ฅธ์ชฝ ์๋ ๊ผญ์ง์ ์ ์ฐพ๋๋ค๊ณ ์๊ฐํ์๋, ํ ์ ์ ์ฐ๊ณ ์ต๋๋ก ๊ทธ๋ฆด ์ ์๋ ์ ์ฌ๊ฐํ์ ์ฐพ์์ผ ํ๋ค.
- ์ค์ ๋ก๋ ์ต๋๋ก ๊ทธ๋ ค์ง๋ ๊ฐ์ ์ฐพ์์ผ ํด์ ๋ ๊ฑธ๋ฆฌ๊ฒ ์ง๋ง,
๊ทธ๋ ค์ง๋ ์ ์ฌ๊ฐํ์ ํ ๋ณ์ ๊ธธ์ด๊ฐ k๋ผ๊ณ ํ์ ๋,์ด๋ฆผ์ก์์ ์๊ฐ ๋ณต์ก๋๋ O(n*m*k*k)์ด๋ค. - ๋ฐ๋ผ์ 1,000 ^ 4 = 1์กฐ๋ก ์๊ฐ ์ ํ์ธ 1์ด๋ฅผ ๊ฐ๋ฟํ ๋๊ฒ ๋๋ค.
- 2์ฐจ์ ๋ฐฐ์ด ํ์์์ ํจ์จ์ ๋์ด๊ณ ์ ํ๋ ๊ฒฝ์ฐ์ฌ์ DP๋ฅผ ์์ฌํ๊ณ ์ ํ์์ ์ฐพ๊ธฐ์ํด ๋
ธ๋ ฅํ๋ค.
- ๋ช ์พํ ์ ํ์ ๋์ ์์ผ๋ก ์ ์ด๋ณด๋ฉฐ row, col ํฉ๋ฐฐ์ด์ ๋ง๋ ๋ค dp ๋ฐฐ์ด์ ๋ง๋๋ ํ์์ผ๋ก ์ด๋ป๊ฒ๋ ํ์ด๋๋ค.
- ์ ๋ต์ ๋ง์ ๋ค์ gpt๋ฅผ ํตํด ์ ํ์์ ํจ์จ์ ์ผ๋ก ๋ง๋ค์ด ๋ณด์๋๋ฐ, ๊ทธ๋ฅ ํ์ฌ ์ธ๋ฑ์ค์ ์ผ์ชฝ, ์์ชฝ, ์ผ์ชฝ์ ๋๊ฐ์ ์ธ ์ธ๋ฑ์ค ๊ฐ ์ค ์ต์๊ฐ์ +1 ํ๋ฉด ๋๋ ํ์์ด์๋ค.
๐ธ ๊ธฐ์กด ํ์ด ์ฝ๋ ๐ธ
import java.io.*;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
// Input
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
int[][] arr = new int[n + 1][m + 1];
int[][] rowSeq = new int[n + 1][m + 1];
int[][] colSeq = new int[n + 1][m + 1];
int[][] square = new int[n + 1][m + 1];
for (int i = 1; i <= n; i++) {
char[] chars = br.readLine().toCharArray();
for (int j = 1; j <= m; j++) {
arr[i][j] = Character.getNumericValue(chars[j - 1]);
}
}
// Row fill
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (arr[i][j] == 1) {
rowSeq[i][j] = rowSeq[i][j - 1] + 1;
}
}
}
// Col fill
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
if (arr[j][i] == 1) {
colSeq[j][i] = colSeq[j - 1][i] + 1;
}
}
}
// Square fill
int max = 0;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (arr[i][j] == 0)
continue;
int min = Math.min(rowSeq[i][j], colSeq[i][j]); // ๊ฐ๋ก์ธ๋ก ์ฐ์ min๊ฐ ์์
if (square[i - 1][j - 1] >= min - 1) { // ์ข์๋จ ๋๊ฐ์ ์ min-1 ํฌ๊ธฐ ์ ์ฌ๊ฐํ ์์
square[i][j] = min;
} else if (square[i - 1][j - 1] + 1 <= min) {
square[i][j] = square[i - 1][j - 1] + 1;
} else {
square[i][j] = 1;
}
max = Math.max(max, square[i][j]);
}
}
// Output
bw.write(Integer.toString(max * max));
bw.flush();
}
}
๐ธ ์ฝ๋ ํด์ ๐ธ
- arr ๋ฐฐ์ด์ ์ ๋ ฅ ์ ๋ณด๋ฅผ ์ ์ฅํ๊ณ , rowSeq ์ colSeq์ ๊ฐ๋ก ์ค๋ฅธ์ชฝ, ์ธ๋ก ์๋์ชฝ์ผ๋ก ํฉ๋ฐฐ์ด์ ๋ง๋ค์๋ค.
- ๊ทธ๋ฆฌ๊ณ ์ฌ์ค์ dp๋ฐฐ์ด์ธ square๋ฐฐ์ด์ ์ ์ฌ๊ฐํ ์ค๋ฅธ์ชฝ์๋ ์ธ๋ฑ์ค๋ฅผ ๋๊ณ ๊ฐ์ฅ ํฐ ์ ์ฌ๊ฐํ์ ํ ๋ณ์ ๊ธธ์ด๋ฅผ ์ ์ฅํ๋ฉฐ ๊ณ์ฐ์ ์งํํ๋ค.
- arr ๋ฐฐ์ด ๊ฐ์ด 0์ธ ๊ฒฝ์ฐ๋ ์ฌ๊ฐํ์ ๊ทธ๋ฆด ์ ์์ผ๋ฏ๋ก ๋์ด๊ฐ๋ค.
- ๊ฐ๋ก ์ธ๋ก ์ฐ์๊ฐ ์ค ์์ ๊ฐ(min)์ ๊ณจ๋ผ ์ ์ฌ๊ฐํ์ ๊ทธ๋ฆด ์ ์๋์ง ํ๋จํ๋ค.
- square ๋ฐฐ์ด์์ ์ข์๋จ ์ธ๋ฑ์ค๋ฅผ ์ดํด๋ณด๊ณ ์ ์ฌ๊ฐํ์ ๋ด๋ถ๊ฐ 1๋ก ์ฐจ์๋์ง ํ์ธํ๋ค. min๊ฐ์ผ๋ก ๋ฐ๋ก ์์ชฝ๊ณผ ์ผ์ชฝ์ 1์ด ์ฐจ์๋ค๋ ๊ฒ์ ์๊ณ ์์ผ๋ฏ๋ก, ์ข์๋จ ์ธ๋ฑ์ค๊ฐ ์ฐจ์์ผ๋ฉด ์ ์ฌ๊ฐํ์ ๊ทธ๋ฆด ์ ์๋ค.
- ์ด๋, ์ข์๋จ ์ธ๋ฑ์ค์ ๊ฐ์ด min - 1๋ณด๋ค ์์ผ๋ฉด min ๋ณด๋ค ์์ ์ ์ฌ๊ฐํ์ผ๋ก ๊ทธ๋ ค์ง๋์ง ํ์ธํด์ผํ๋ค.
์ข์๋จ ์ธ๋ฑ์ค ๊ฐ + 1์ด min ์ดํ์ด๋ฉด ๊ทธ ๊ฐ์ผ๋ก ์ ์ฌ๊ฐํ์ ๊ทธ๋ฆฐ๋ค. - ๋ง์ง๋ง์ผ๋ก ๋ชจ๋ ํด๋นํ์ง ์์ผ๋ฉด square์ 1์ ์ ์ฅํ๋ค.
- square์ ์ ์ฅ๋ ๊ฐ ์ค ์ต๋๊ฐ์ ์ ๊ณฑ์ ์ถ๋ ฅํ๋ค.
๐ธ ์ ํ์ ๊ฐ์ ํ์ด ์ฝ๋ ๐ธ
import java.io.*;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
// Input
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
int[][] arr = new int[n][m];
int[][] dp = new int[n][m];
for (int i = 0; i < n; i++) {
char[] chars = br.readLine().toCharArray();
for (int j = 0; j < m; j++) {
arr[i][j] = Character.getNumericValue(chars[j]);
}
}
int max = 0; // ์ฒซ ๋ฒ์งธ ํ๊ณผ ์ด์ ๊ณ ๋ คํ์ฌ max ์ด๊ธฐํ๋ฅผ 0์ผ๋ก ์ค์
// copy first col and check max
for (int i = 0; i < n; i++) {
dp[i][0] = arr[i][0];
max = Math.max(max, dp[i][0]); // ์ฒซ ๋ฒ์งธ ์ด์ ๋ํ ์ต๋๊ฐ ํ์ธ
}
// copy first row and check max
for (int j = 0; j < m; j++) {
dp[0][j] = arr[0][j];
max = Math.max(max, dp[0][j]); // ์ฒซ ๋ฒ์งธ ํ์ ๋ํ ์ต๋๊ฐ ํ์ธ
}
// DP
for (int i = 1; i < n; i++) {
for (int j = 1; j < m; j++) {
if (arr[i][j] == 0)
continue;
dp[i][j] = Math.min(Math.min(dp[i - 1][j], dp[i][j - 1]), dp[i - 1][j - 1]) + 1;
max = Math.max(max, dp[i][j]);
}
}
// Output
bw.write(Integer.toString(max * max));
bw.flush();
}
}
๐ธ ์ฝ๋ ํด์ ๐ธ
- ๊น๋ํ๊ฒ DP ์ ํ์์ด ๋์จ ํ์ด์ด๋ค.
- dp๋ฐฐ์ด์ ์ธ๋ฑ์ค๋ฅผ ์ ์ฌ๊ฐํ์ ์ฐํ๋จ ์ธ๋ฑ์ค๋ก ๋ณด๊ณ , ์ ํ์ด์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ ์ฌ๊ฐํ์ ํ ๋ณ์ ๊ธธ์ด๋ฅผ ์ ์ฅํ๋ ๋ฐฉ์์ผ๋ก ์งํํ๋ค.
- ์ ํ์์ min(์ผ์ชฝ, ์์ชฝ, ์ข์๋จ) + 1 ์ด๋ค.
- dp๋ฐฐ์ด์ ์ฑ์ฐ๊ธฐ ์ ์ ์ด๊ธฐ๊ฐ์ผ๋ก ์ฒซ ๋ฒ์งธ ์ด๊ณผ ํ์ ๊ธฐ์กด ์ ๋ ฅ ๊ฐ์ ๋ณต์ฌํด์ฃผ์ด์ผ ํ๋ค.
- ์ด๊ธฐ๊ฐ๊ณผ dp๋ฐฐ์ด ๊ณ์ฐ ์ ์ต๋๊ฐ ํ์ธํด์ ์ ๊ณฑ ๊ฐ์ ์ถ๋ ฅํ๋ค.
๐ธ end ๐ธ
- ์ ํ ์๊ฐ 1์ด์ธ๊ฑธ ๋ณด๊ณ , ๋ฐ๋ก dp๋ฌธ์ ์ธ๊ฑธ ๋์น์ฑ๋ค. ํ์ง๋ง ์ ํ์ ๋์ถ์ด ์ด๋ ค์์ ์ฌ๋ฌ ๋ฐฉํฅ์ผ๋ก ํฉ๋ฐฐ์ด์ ๊ทธ๋ ค๋ณด๊ฑฐ๋ ํ๋ฉด์ ๊ท์น์ ์ฐพ๊ณ ์ ํ๋ค.
- ๊ฒฐ๊ตญ ํ์ด๋ ๋๋๋ฐ, ํจ์จ์ด ์ข์ง ์์์ GPT๋ฅผ ํตํด ์ ํ์์ ๋ค์ ๋์ถํด์ ์กฐ๊ธ ๋ ํจ์จ ์ข๊ฒ ์ฌํ์ดํ๋ค.
- ์ฌํ์ด ๊ณผ์ ์์ ์ฒซ ํ๊ณผ ์ด์ ์ด๊ธฐ๊ฐ์ ๋ฃ๋ ๋ฐ๋ณต๋ฌธ์๋ ์ต๋๊ฐ ๋์ถ์ด ํ์ํ์ด์ ํ๋ฒ ํ๋ ธ๋ค.
728x90
'CodingTest > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํ๊ธฐ] ํ๋ก๊ทธ๋๋จธ์ค ์ฝ๋ฉ์ ๋ฌธ์ญ๋์ธ์ฆ(PCCP) Lv3 ์ทจ๋ (0) | 2024.05.20 |
---|---|
BOJ_5052 : ์ ํ๋ฒํธ ๋ชฉ๋ก (0) | 2024.05.19 |
BOJ_11657 : ํ์๋จธ์ (0) | 2024.05.11 |
BOJ_1261 : ์๊ณ ์คํ (0) | 2024.05.10 |
BOJ_1339 : ๋จ์ด ์ํ (0) | 2024.05.06 |