1. ๋ฌธ์ ์ค๋ช ๐
๋ฌธ์ ๋ด์ฉ์ด ์ง๊ด์ ์ด๊ธฐ ๋๋ฌธ์ ๋ถ๊ฐ ์ค๋ช ์ ์๋ตํ๊ฒ ๋ค.
2. ์ ๊ทผ ๋ฐฉ์ ๐๏ธ
KEY WORD
: BFS
oils
๋ผ๋ 1์ฐจ์ ๋ฐฐ์ด์ ๋ง๋ ๋ค. ํด๋น ๋ฐฐ์ด์ index ๋ land์ ์ด์ด๊ณ , value๋ ์ด ๋น ์ป์ ์ ์๋ ์์ ์ ์์ด๋ค.- land ์ ์ฒด์ ๋ํด์ ์ด์ค ๋ฐ๋ณต๋ฌธ์ผ๋ก ์์ (
1
)์ด ์๋ ์์น๋ฅผ ์ฐพ๋๋ค - ๋ง์ฝ ์์ ๋ฅผ ์ฐพ๋๋ค๋ฉด ํด๋น ์์น๋ถํฐํด์ ์ฐ๊ฒฐ๋ ์์ ๋ฉ์ด๋ฆฌ๋ฅผ
BFS
๋ก ์ฐพ๋๋ค. - BFS๋ก ํด๋น ์์น์์ ์์ํด ์์ ๋ฉ์ด๋ฆฌ๋ฅผ ๋ชจ๋ ์ฐพ์์ผ๋ฉด, ์ง๊ธ๊น์ง ๊ฑฐ์น ์ ์๋ ์ด์ ์ง๊ธ๊น์ง ์ฐพ์ ์์ ๋์ ๋ํ๋ค.
(์๋ฅผ ๋ค์ด, ์ด์ 1,2,3 ๊ฑฐ์ณค๊ณ , ์ฐพ์ ์์ ๋์ด 7์ด๋ฉด oils[1] += 7, oils[2] += 7, oils[3] += 7 ์ด ๋๋ค.)
3. ์ฝ๋ ์๊ฐ ๐
๋จผ์ ์ ์ฒด ์ฝ๋๋ฅผ ๋ณด์ฌ์ฃผ๊ณ , ํ๋ ํ๋ ์ธ์ธํ๊ฒ ๋ถ์ํ๊ฒ ๋ค.
(0) ์ ์ฒด ์ฝ๋ ์๊ฐ
import java.io.*;
import java.util.*;
class Solution {
// 1. make one dimension array which represent land array's column to store amount oil in each column;
// 2. return Max amount
static int [] oils;
static int [][] dir = {{0,1},{0,-1},{1,0},{-1,0}};
public int solution(int[][] land) {
oils = new int[land[0].length];
for(int i = 0; i < land.length; i++){
for(int j = 0; j < land[i].length; j++){
if(land[i][j] == 1) bfs(i,j,land);
}
}
Arrays.sort(oils);
return oils[oils.length-1];
}
public void bfs (int r, int c, int [][] land){
// 0 = soil, 1 = oil, 2 = visited already
ArrayDeque<Coordinate> aq1 = new ArrayDeque<>();
HashSet<Integer> set = new HashSet<>();
aq1.add(new Coordinate(r,c));
set.add(c);
land[r][c] = 2;
int acc = 1;
while(!aq1.isEmpty()){
Coordinate now = aq1.poll();
for(int i = 0; i < 4; i++){
int nr = now.r + dir[i][0];
int nc = now.c + dir[i][1];
if(nr >= land.length || nr < 0 || nc >= land[0].length || nc < 0) continue;
if(land[nr][nc] == 0 || land[nr][nc] == 2) continue;
acc++;
land[nr][nc] = 2;
set.add(nc);
aq1.add(new Coordinate(nr,nc));
}
}
for(int column : set){
oils[column] += acc;
}
}
}
class Coordinate {
int r;
int c;
public Coordinate (int r, int c){
this.r = r;
this.c = c;
}
}
(1) BFS ๋ถ๋ถ
public void bfs (int r, int c, int [][] land){
// 0 = soil, 1 = oil, 2 = visited already
ArrayDeque<Coordinate> aq1 = new ArrayDeque<>();
HashSet<Integer> set = new HashSet<>();
aq1.add(new Coordinate(r,c));
set.add(c);
land[r][c] = 2;
int acc = 1;
while(!aq1.isEmpty()){
Coordinate now = aq1.poll();
for(int i = 0; i < 4; i++){
int nr = now.r + dir[i][0];
int nc = now.c + dir[i][1];
if(nr >= land.length || nr < 0 || nc >= land[0].length || nc < 0) continue;
if(land[nr][nc] == 0 || land[nr][nc] == 2) continue;
acc++;
land[nr][nc] = 2;
set.add(nc);
aq1.add(new Coordinate(nr,nc));
}
}
for(int column : set){
oils[column] += acc;
}
}
์ผ๋ฐ BFS๋ ๋๊ฐ์ง๋ง ํ๊ฐ์ง ๋ค๋ฅธ ์ ์ ์ด์ ๊น์ง ๊ฑฐ์ณค๋ ์ด์ HashSet์ ์ ์ฅํด๋จ๋ค๊ฐ ๋ง์ง๋ง์ ํด๋น ์ด์ ํด๋นํ๋ oils ์์์ ์ฐพ์ ์์ ๋์ ๋ํ๋ค๋ ์ ์ด๋ค.
Coordinate ํด๋์ค๋ ๊ทธ์ ์ขํ๋ฅผ ์ ์ฅํ ํด๋์ค์ด๊ณ , ๋ง์ง๋ง์ ์ต๋๋์ ๊ตฌํ๊ธฐ ์ํด oils ๋ฐฐ์ด์ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ๊ณ ๋ง์ง๋ง ๊ฐ์ ๋ฐํํ๋ค. ์ด์ ๊ป ํ์๋ Lv2์ ๋นํด์ ์ฌ์ด ๋ฌธ์ ์๋ค.
4. ๋ฐฐ์ด ๊ฒ๋ค ๐ฏ
์๊ฐ ๋ณต์ก๋์ ๋ํด์ ๊ณต๋ถ๋ฅผ ํ๋ค๊ณ ์๊ฐํ๋๋ฐ, ์์ง ๋ถ์กฑํ ๋ฏ ํ๋ค. ์ฒซ ํ์ด๋ ์ ํ์ฑ ํ ์คํธ์์ ๋ง์ ์ด์์ผ๋, ํจ์จ์ฑ ํ ์คํธ๋ฅผ ์ ๋ถ ํ๋ฆฌ๋ฉฐ ๋ฐํ์ํ๋ค. ์ด์ ๊ป ํ์๋ ์ฝ๋ฉ ํ ์คํธ์์ ์ด๋ฌํ ์ด์ ๋ก ๋ถํฉ๊ฒฉ์ ๋ง์ด ๋ฐ์ง ์์์๊น? ๋์ ๊ฐ์ด ์๊ฐ๋ณต์ก๋ ๋๋ฌธ์ ๊ณจ๋จธ๋ฆฌ๋ฅผ ์ฉ๋ ๋ถ๋ค์ด ๊ณ์ค๊ฑฐ๋ผ ์๊ฐํด ๋ด ์ฒซ ํ์ด์ ์ ๋์๋ ์ด์ , ์๊ฐ ๋ณต์ก๋ ๊ณ์ฐ์์ ํ๋ ์ฐฉ๊ฐ์ ๊ณต์ ํ๋ค.
(1) ์ฒซ ํ์ด ์๊ฐ
์ ๊ทผ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ๋ค.
- ์ง์ง ์์ ์์ถํ๋ฏ์ด ๋ชจ๋ ์ด์ 0 ~N๊น์ง ๋ด๋ ค๊ฐ๋ฉด์ ํ์ํ๋ค. ์ด๋ ๊ตฌํ ์์ ๋์ ๋ชจ๋ ๋ํ๋ค.
- land๋ฅผ ์ฐ๋ฉด, ์ด๋ง๋ค ๊ณ์ฐ์ด ์ค์ฒฉ๋๋ฏ๋ก copy๋ผ๋ ๋ณต์ฌ ๋ฐฐ์ด์ ๋ง๋ค์ด ๋งค๋ฒ BFS๋ฅผ ์๋กญ๊ฒ ํ๋ค.
- ์ด๋ง๋ค ๊ตฌํ์ ๋, ์์ ๋์ด ๊ฐ์ฅ ํฐ ๊ฐ์ ์ฐพ๋๋ค.
import java.io.*;
import java.util.*;
class Solution {
// 1. choose a column;
// 2. use BFS which contact with a column we choose;
static int [][] dir = {{0,1},{0,-1},{1,0},{-1,0}};
public int solution(int[][] land) {
int ans = 0;
for(int i = 0; i < land[0].length; i++){
int [][] copy = new int[land.length][land[0].length];
doCopy(land, copy);
ans = Math.max(ans, bfs(i, copy));
}
return ans;
}
public void doCopy(int [][] original, int [][] copy){
for(int i = 0; i < original.length; i++){
System.arraycopy(original[i], 0, copy[i], 0, original[i].length);
}
}
// BFS for each column;
public int bfs (int start, int [][] land){
// 0 = soil, 1 = oil, 2 = visited already
ArrayDeque<Coordinate> aq1 = new ArrayDeque<>();
int acc = 0;
for(int i = 0; i < land.length; i++){
if(land[i][start] == 1){
land[i][start] = 2;
aq1.add(new Coordinate(i,start));
acc++;
while(!aq1.isEmpty()){
Coordinate now = aq1.poll();
for(int j = 0; j < 4; j++){
int nr = now.r + dir[j][0];
int nc = now.c + dir[j][1];
if(nr >= land.length || nr < 0 || nc >= land[0].length || nc < 0) continue;
if(land[nr][nc] == 0 || land[nr][nc] == 2) continue;
land[nr][nc] = 2;
aq1.add(new Coordinate(nr,nc));
acc++;
}
}
}
}
return acc;
}
}
class Coordinate {
int r;
int c;
public Coordinate (int r, int c){
this.r = r;
this.c = c;
}
}
(2) ๋ด ํ์ด๊ฐ ์๊ฐ์ด๊ณผ๊ฐ ๋ฌ๋ ์ด์
a. ๋ฐฐ์ด์ ๋ณต์ฌํ๋ ๊ฒ
๋ฌธ์ ์ ํ๊ณผ ์ด์ ์ต๋๊ฐ์ด 500์ด๋ค. ์ผ๋จ ๋ฐฐ์ด ๋ณต์ฌ์์๋ถํฐ ์๊ฐ์ด๊ณผ๊ฐ ๋๋ค. ๋๋ ์ด๋ง๋ค ๋งค๋ฒ ์๋ก์ด 2์ฐจ์ ๋ฐฐ์ด์ ์์ฑํด์ผ ํ์ผ๋ฏ๋ก, 500 * 500 * 500 ์ ํด์ผํด์ 1.25์ต๋ฒ์ ๊ณ์ฐ์ ํ๋ค. ์ด๋ 1์ด 1์ต๋ฒ ๊ณ์ฐ ์ด๋ด๋ก ํด์ผํ๋ ์ฝ๋ฉ ํ ์คํธ์ ๊ณ์ฐ ํ์ ๋ฒ์๋ฅผ ํจ์ฌ ๋ฐ์ด๋๋๋ค.
b. BFS๋ฅผ ๋งค๋ฒ ์ด๊ธฐํํด์ ์๋กญ๊ฒ ํ๋ ๊ฒ
๋ง์ฝ land๊ฐ ๋ชจ๋ 1๋ก ์ด๋ฃจ์ด์ง ๋ ์ด๋ผ ์๊ฐํด๋ณด์. ๊ทธ๋ฌ๋ฉด ํ๋ ฌ์ด ๊ฐ๊ฐ 500์ด๋ผ๋ฉด ์ด(500)๋ง๋ค BFS(500*500)์ ๋งค๋ฒ ๋ค์ ํด์ผํ๋ค. ์ด๊ฒ๋ 1.25์ต๋ฒ์ ์ฐ์ฐ์ด ์ด๋ฃจ์ด์ ธ ์๊ฐ ์ด๊ณผ๊ฐ ๋๋ค.
๋ฐ๋ผ์ ์๊ฐ ์ด๊ณผ๊ฐ ๋ ์ ๋ฐ์ ์๋ ๊ฒ์ด๋ค.
(3) ์๊ฐ ๋ณต์ก๋ ๊ณ์ฐ๊ณผ ๊ดํ์ฌ
a. ํ์ฌ ๊ณ์ฐ๋ 2์ฐจ์ ๋ฐฐ์ด๋ก ์์ ํ์ ๋ฐ ์์ ๋ฉด BFS ์งํ์ธ๋ฐ, ์๊ฐ๋ณต์ก๋๊ฐ ๊ด์ฐฎ๋์? ๐ค๐ญ
์ธ๋ป ๋ณด๋ฉด ํ์ฌ ํ์ด๋ 2์ฐจ์ ๋ฐฐ์ด๋ก ์์ ์ ์์ ์์น๋ฅผ ํ์ํ๊ณ , ๊ฑฐ๊ธฐ์ ๋ถํฐ ๋ค์ BFS๋ฅผ ์งํํด์ ์ฐ์๋ ๊ฒ์ผ๋ก ๋ณด์ฌ O(n * m * n * m)์ด์ง ์์์ง ์๋ฌธ์ด ๋ค ์ ์๋ค. ํ์ง๋ง ๋ด ์ ๋ต ํ์ด๋ ์ด์ค ๋ฐ๋ณต๋ฌธ๊ณผ BFS๊ฐ ์ฐ์(์ค์ฒฉ) ๋์ง ์๋๋ค. ์๋ํ๋ฉด ๋ง์ฝ ๋ชจ๋ ๋
์ด ์์ ๋ผ์ land[1] [1] ์์ BFS๋ฅผ ๋ ๊ฒฝ์ฐ, ํด๋น ๊ฒฝ์ฐ ํ ๋ฒ๋ง BFS๊ฐ ํ์ฉ๋๊ณ ์ดํ, BFS๋ฅผ ์ฌ์ฉํ์ง ์๊ธฐ ๋๋ฌธ์ด๋ค. ์ฆ 2์ฐจ์ ๋ฐฐ์ด ์์๋ง๋ค BFS๋ฅผ ์คํํ์ง ์๊ธฐ ๋๋ฌธ์ ๋ ๊ณ์ฐ์ ์ํธ ๋
๋ฆฝ์ ์ด๋ค.
๋ฐ๋ฉด ๋ด๊ฐ ์๊ฐ์ด๊ณผ๊ฐ ๋ฌ๋ ํ์ด๋ ๋ชจ๋ ์ด๋ง๋ค BFS๋ฅผ ๋ค์ ํ๋ค. ์ฆ ์ ๋ต ํ์ด๋ BFS์ ์ด์ค๋ฐ๋ณต๋ฌธ์ด ๋
๋ฆฝ์ ์ด๋ผ ๋ ์ค ์ ์ผ ์๊ฐ์ด ๋ง์ด ๋๋ ์ด์ค ๋ฐ๋ณต๋ฌธ์ด ์ต์
์ ์๊ฐ๋ณต์ก๋์ธ ๋ฐ๋ฉด, ์๊ฐ์ด๊ณผ๊ฐ ๋ ํ์ด๋ BFS์ ์ด์ค ๋ฐ๋ณต๋ฌธ์ด ์ฐ์์ (์ค์ฒฉ)์ด์ด์ ๋์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ณฑํด์ผ ์ต์ข
์๊ฐ๋ณต์ก๋๊ฐ ๋์จ๋ค.
b. ์ฐ์์ ์ด๋ค. vs ๋ ๋ฆฝ์ ์ด๋ค.
์ฐ์์ ์ด๋ผ ํ๋ฉด ์์ฒ๋ผ ๊ณ์ฐ๊ณผ ๊ณ์ฐ์ ์ธ๊ณผ๊ด๊ณ๊ฐ ํ์ฐ์ ์ด๋ผ๋ ๊ฒ์ด๋ค. ์๊ฐ์ด๊ณผ๊ฐ ๋ ํ์ด์์ ์ด์ค๋ฐ๋ณต๋ฌธ ํ์๋ ๋ฌด์กฐ๊ฑด BFS๊ฐ ๋ค์ ์คํ๋์ด์ผ ํ๋ค. ๋ฐ๋ฉด ๊ณ์ฐ๊ณผ ๊ณ์ฐ์ด ๋ ๋ฆฝ์ ์ด๋ผ๋ฉด, ๋ ์ฌ์ด์ ์ธ๊ณผ๊ด๊ณ๊ฐ ํ์ฐ์ ์ด์ง ์๋ค. ์ ๋ต ํ์ด์์๋ ์ด์ค ๋ฐ๋ณต๋ฌธ ํ์ BFS๋ฅผ ์คํํ์ง ์๋ ๊ฒฝ์ฐ๋ ์๊ณ , ์คํํ๋ ๊ฒฝ์ฐ๋ ์๋๋ฐ, ์ด ์ฃผ๊ธฐ๊ฐ ๊ท์น์ ์ด์ง๋ ์๊ณ ๋์ ๋ฐ๋ผ ๋ค๋ฅด๋ค.