๋ฌธ์ ๋งํฌ : https://school.programmers.co.kr/learn/courses/30/lessons/250136#
ํ๋ก๊ทธ๋๋จธ์ค
์ฝ๋ ์ค์ฌ์ ๊ฐ๋ฐ์ ์ฑ์ฉ. ์คํ ๊ธฐ๋ฐ์ ํฌ์ง์ ๋งค์นญ. ํ๋ก๊ทธ๋๋จธ์ค์ ๊ฐ๋ฐ์ ๋ง์ถคํ ํ๋กํ์ ๋ฑ๋กํ๊ณ , ๋์ ๊ธฐ์ ๊ถํฉ์ด ์ ๋ง๋ ๊ธฐ์ ๋ค์ ๋งค์นญ ๋ฐ์ผ์ธ์.
programmers.co.kr
ํ์ด๊ณผ์
๊ฐ ์ด ๋ง๋ค ํ๋์ฉ ์๋๋ก ๋ด๋ ค๊ฐ๋ฉฐ ํ์์ ์ํํฉ๋๋ค. ์ด๋ ์ด๋ฏธ ๊ณ์ฐ ๋ ์์ญ์ ๋ค์ ๊ณ์ฐํ์ง ์๊ธฐ ์ํด ๋ฉ๋ชจ๋ฆฌ์ ์ด์ ์ ํด์ค์ผ ํฉ๋๋ค. ๋ฉ๋ชจ๋ฆฌ์ ์ด์ ์ ์ํด ์์ญ๋ฒ ๋ฒํธ๋ฅผ ํ ๋นํ๊ณ HashMap์ ํ์ฉํด ๊ทธ ํฌ๊ธฐ๋ฅผ ์ ์ฅํ์ต๋๋ค.
๋ฉ๋ชจ๋ฆฌ์ ์ด์
1. ์์ ์ธ ์์ญ(1)์ ๋ง๋๊ฒ ๋๋ฉด, ํด๋น ์์ญ์ ํฌ๊ธฐ๋ฅผ bfs๋ก ํ์ธํฉ๋๋ค. ์ด๋, ์์ญ๋ณ ๋ฒํธ (์ ๋ -1,-2,-3 ... ์์๋ก ํํํ์ต๋๋ค)์ ํด๋น ์์ญ๋ณ ๋ฒํธ์ ํด๋นํ๋ ํฌ๊ธฐ๋ฅผ HashMap ์๋ฃ๊ตฌ์กฐ์ ์ ์ฅํฉ๋๋ค.
int bfs(int r,int c,int[][] land,int area_num){
Deque<int[]> q = new ArrayDeque<>();
// boolean[][] visited = new boolean[H][W]; // ์ด ์ฝ๋ ๋๋ฌธ์ ํจ์จ์ฑ ํ
์คํธ 2๋ฒ๊ณผ 3๋ฒ์์ ์๊ฐ์ด๊ณผ๊ฐ ๋ฌ๋ค.
q.offer(new int[]{r,c});
land[r][c] = area_num;
// visited[r][c] = true;
int result = 1;
while(!q.isEmpty()){
int[] cur = q.pollFirst();
int cr = cur[0];
int cc = cur[1];
for(int d=0;d<4;d++){
int nr = cr + dr[d];
int nc = cc + dc[d];
if(nr<0 || nr>=H) continue;
if(nc<0 || nc>=W) continue;
// if(visited[nr][nc]) continue;
if(land[nr][nc]==1){
result+=1;
land[nr][nc] = area_num;
// visited[nr][nc]=true;
q.offer(new int[]{nr,nc});
}
}
}
map.put(area_num,result);
return result;
}
๋งค๊ฐ๋ณ์๋ก ๋๊ฒจ๋ฐ์ area_num์ ํตํด ๋ฐฉ๋ฌธ์ฒ๋ฆฌ๋ฅผ ํ ๋ฒ์ ์งํํ ์ ์์ต๋๋ค. ์ด ๋ฌธ์ ์์ boolean์ ํ์ฉํ๊ฒ ๋๋ค๋ฉด ํจ์จ์ฑ์ฒดํฌ์์ ์๊ฐ์ด๊ณผ๊ฐ ๋ฐ์ํ์ต๋๋ค.
2. ๋ง์ฝ ์๋๋ก ๋ด๋ ค๊ฐ๋ค ์์์ธ ์์ญ(์ด๋ฏธ ๊ณ์ฐ๋ ์์ญ)์ ๋ง๋๊ฒ ๋๋ฉด ๊ทธ ์์ญ์ ํฌ๊ธฐ HashMap์์ ๊ฐ์ ธ์ ๋ํด์ค๋๋ค.
์ด๋ ์ด๋ฏธ ์ ์ฅํ ์์ญ์ ๋ค์ ์ ์ฅํ์ง ์์์ผ ํ๊ธฐ๋๋ฌธ์ HashSet์ ์ฌ์ฉํ์ต๋๋ค.
1 1 1 1
1 0 0 0
1 0 1 0
1 0 0 0
1 1 1 1
์ ์์ ์ ๊ฐ์ด ใท์๋ก ๋ ๊ฒฝ์ฐ set์ผ๋ก ํ์ธํ ์์ญ์ ๋ํด ์ฒ๋ฆฌํ์ง ์์ผ๋ฉด ์ค๋ณต์ผ๋ก ์์ญ์ ๊ฐ์ด ์ถ๊ฐ๋๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
๋ํ 1๋ฒ ๊ณผ์ ์์ bfs์ํ ํ, set์์ญ์ ๋ฐ๋ก ์ถ๊ฐ๋ฅผ ํด์ค์ผ ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๋ค์ ํด์ ํ ๋ฒ ๋ ๊ฐ์ด ๊ณ์ฐ๋๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค. ์๋ ์ฝ๋๋ฅผ ๋ณด๋ฉด land[r][c]==1 ์ธ ๊ฒฝ์ฐ, bfs๋ฅผ ์ํํ๊ณ set์ ๋ฐ๋ก addํด์คฌ์ต๋๋ค.
if(land[r][c]==1){
cnt += bfs(r,c,land,area_num);
set.add(land[r][c]);
area_num--;
}else if(land[r][c]<0 && !set.contains(land[r][c])){ // ์ด๋ฏธ ํ์ธํ ์์ญ์ด๋ฉด ๊ทธ ๊ฐ ํ์ฉ
cnt += map.get(land[r][c]);
set.add(land[r][c]);
}
์๊ฒ๋ ์
- ๋ฌด์์ ๊ตฌํํ์ง ๋ง๊ณ , ํจ์จ์ฑ์ ์ค์ผ ์ ์๋ ๋ฐฉ๋ฒ (๋ฉ๋ชจ๋ฆฌ์ ์ด์ )์ ์ ์๊ฐํด๋ณผ ์ ์์๋ ๋ฌธ์ ์์ต๋๋ค.
- ํนํ ์ฒ์์๋ bfs์ํ ์ boolean[][] ๋ฐฐ์ด๋ก ๋ฐฉ๋ฌธ์ฒ๋ฆฌ๋ฅผ ํด์คฌ๋๋ฐ, ์ด ๋ฌธ์ ์์ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ๋ฅผ ์ด๋ฏธ ์์ญ ๋ฒํธ(area_num)์ผ๋ก ํด์ฃผ๊ธฐ ๋๋ฌธ์ boolean[][] ๋ฐฐ์ด์ด ํ์์์์ต๋๋ค. ์ค๋ณต๋ ๊ธฐ๋ฅ์ด ์๋ ์ฝ๋๋ฅผ ์ค์ฌ์ ์๊ฐ์ ์ค์ผ ์ ์์์ ๋ฐฐ์ ์ต๋๋ค.
์ ์ฒด์ฝ๋
import java.util.*;
class Solution {
int[] dr = {-1,0,1,0};
int[] dc = {0,1,0,-1};
int W,H;
Map<Integer,Integer> map;
int bfs(int r,int c,int[][] land,int area_num){
Deque<int[]> q = new ArrayDeque<>();
// boolean[][] visited = new boolean[H][W]; // ์ด ์ฝ๋ ๋๋ฌธ์ ํจ์จ์ฑ ํ
์คํธ 2๋ฒ๊ณผ 3๋ฒ์์ ์๊ฐ์ด๊ณผ๊ฐ ๋ฌ๋ค.
q.offer(new int[]{r,c});
land[r][c] = area_num;
// visited[r][c] = true;
int result = 1;
while(!q.isEmpty()){
int[] cur = q.pollFirst();
int cr = cur[0];
int cc = cur[1];
for(int d=0;d<4;d++){
int nr = cr + dr[d];
int nc = cc + dc[d];
if(nr<0 || nr>=H) continue;
if(nc<0 || nc>=W) continue;
// if(visited[nr][nc]) continue;
if(land[nr][nc]==1){
result+=1;
land[nr][nc] = area_num;
// visited[nr][nc]=true;
q.offer(new int[]{nr,nc});
}
}
}
map.put(area_num,result);
return result;
}
public int solution(int[][] land) {
int answer = 0;
W = land[0].length;
H = land.length;
map = new HashMap<>();
Set<Integer> set;
int area_num = -1;
for(int c=0;c<W;c++){
int cnt = 0;
set = new HashSet<>();
for(int r=0;r<H;r++){
if(land[r][c]==1){
cnt += bfs(r,c,land,area_num);
set.add(land[r][c]);
area_num--;
}else if(land[r][c]<0 && !set.contains(land[r][c])){ // ์ด๋ฏธ ํ์ธํ ์์ญ์ด๋ฉด ๊ทธ ๊ฐ ํ์ฉ
cnt += map.get(land[r][c]);
set.add(land[r][c]);
}
}
answer = Math.max(answer,cnt);
}
return answer;
}
}
'๐์ฝ๋ฉํ ์คํธ:CodingTest' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํ๋ก๊ทธ๋๋จธ์ค] ์๋ด์ ์ธ์ (0) | 2024.06.26 |
---|---|
[ํ๋ก๊ทธ๋๋จธ์ค] ๋ค๋ฆฌ๋ฅผ ์ง๋๋ ํธ๋ญ (0) | 2024.06.24 |
์์ค์ ๊ธฐ์ฌ ๋๊ฒฐ(์ผ์ฑ sw์ญ๋ํ ์คํธ) (0) | 2024.04.12 |
๋ฃจ๋ํ์ ๋ฐ๋(์ผ์ฑ sw์ญ๋ํ ์คํธ) (0) | 2024.04.10 |
[๋ฐฑ์ค] ์ํ ๋๋ฆฌ๊ธฐ (0) | 2024.04.09 |