๋ฌธ์ (์ถ์ฒ: https://www.acmicpc.net/problem/1303)
<์ ์-์ ํฌ>
๋ฌธ์
์ ์์ ์ด๋๋ง ์ ๋ฉด์ ์ด ์์๋์๋ค. ๊ฒฐ๊ตญ ์ ํฌ๋ ๋์ ์ด ๋์๊ณ , ์ฐ๋ฆฌ ๋ณ์ฌ์ ์ ๊ตญ ๋ณ์ฌ๊ฐ ์์ฌ ์ธ์ฐ๊ฒ ๋์๋ค. ๊ทธ๋ฌ๋ ๋น์ ์ ๋ณ์ฌ๋ค์ ํฐ์ ์ท์ ์ ๊ณ , ์ ๊ตญ์ ๋ณ์ฌ๋ค์ ํ๋์ ์ท์ ์ ์๊ธฐ ๋๋ฌธ์ ์๋ก๊ฐ ์ ์ธ์ง ์๊ตฐ์ธ์ง๋ ๊ตฌ๋ถํ ์ ์๋ค. ๋ฌธ์ ๋ ๊ฐ์ ํ์ ๋ณ์ฌ๋ค์ ๋ชจ์ด๋ฉด ๋ชจ์ผ์๋ก ๊ฐํด์ง๋ค๋ ์ฌ์ค์ด๋ค.
N๋ช ์ด ๋ญ์ณ์์ ๋๋ N2์ ์๋ ฅ์ ๋ผ ์ ์๋ค. ๊ณผ์ฐ ์ง๊ธ ๋์ ์ ์ํฉ์์๋ ๋๊ฐ ์น๋ฆฌํ ๊ฒ์ธ๊ฐ? ๋จ, ๊ฐ์ ํ์ ๋ณ์ฌ๋ค์ด ๋๊ฐ์ ์ผ๋ก๋ง ์ธ์ ํ ๊ฒฝ์ฐ๋ ๋ญ์ณ ์๋ค๊ณ ๋ณด์ง ์๋๋ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์๋ ์ ์ํฐ์ ๊ฐ๋ก ํฌ๊ธฐ N, ์ธ๋ก ํฌ๊ธฐ M(1 ≤ N, M ≤ 100)์ด ์ฃผ์ด์ง๋ค. ๊ทธ๋ค์ ๋ ๋ฒ์งธ ์ค์์ M+1๋ฒ์งธ ์ค์๋ ๊ฐ๊ฐ (X, Y)์ ์๋ ๋ณ์ฌ๋ค์ ์ท์์ด ๋์ด์ฐ๊ธฐ ์์ด ์ฃผ์ด์ง๋ค. ๋ชจ๋ ์๋ฆฌ์๋ ๋ณ์ฌ๊ฐ ํ ๋ช ์๋ค. B๋ ํ๋์, W๋ ํฐ์์ด๋ค. ๋น์ ์ ๋ณ์ฌ์ ์ ๊ตญ์ ๋ณ์ฌ๋ ํ ๋ช ์ด์ ์กด์ฌํ๋ค.
์ถ๋ ฅ
์ฒซ ๋ฒ์งธ ์ค์ ๋น์ ์ ๋ณ์ฌ์ ์๋ ฅ์ ํฉ๊ณผ ์ ๊ตญ์ ๋ณ์ฌ์ ์๋ ฅ์ ํฉ์ ์ถ๋ ฅํ๋ค.
๋ฌธ์ ํ์ด
- my solution (Python)
import sys
from collections import deque
def bfs(arr, visited, start, find):
dx=[-1,1,0,0] # ์ํ์ข์ฐ
dy=[0,0,-1,1]
queue=deque([start])
visited[start[0]][start[1]]=1
cnt=1
while queue:
temp=queue.popleft()
for i in range(4):
x=temp[0]+dx[i]
y=temp[1]+dy[i]
if 0<=x<len(arr) and 0<=y<len(arr[0]):
if arr[x][y]==find and visited[x][y]==0:
visited[x][y]=1
queue.append([x,y])
cnt+=1
return cnt
if __name__=='__main__':
n,m=map(int,sys.stdin.readline().split()) # ๊ฐ๋ก, ์ธ๋ก
arr=[]
for i in range(m):
arr.append(list(sys.stdin.readline().strip()))
visited_w=[[0]*n for i in range(m)]
visited_b = [[0] * n for i in range(m)]
w_cnt=0
b_cnt=0
for i in range(m):
for j in range(n):
if arr[i][j]=='W' and visited_w[i][j]==0:
cnt=bfs(arr, visited_w, [i,j], 'W')
w_cnt+=(cnt**2)
elif arr[i][j]=='B' and visited_b[i][j]==0:
cnt=bfs(arr, visited_b, [i,j], 'B')
b_cnt+=(cnt**2)
print(w_cnt, end=' ')
print(b_cnt)
- my solution (JAVA)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
public class _1303_์ ์_์ ํฌ {
static int bfs(String[][] arr, int[][] visited, int[] start, String find) {
int dx[]= {-1,1,0,0}; // ์ํ์ข์ฐ
int dy[]= {0,0,-1,1};
visited[start[0]][start[1]]=1;
Queue<int[]> queue=new LinkedList<>();
queue.add(start);
int cnt=1;
while(queue.size()!=0) {
int temp[]=queue.poll();
for(int i=0; i<4; i++) {
int x=temp[0]+dx[i];
int y=temp[1]+dy[i];
if(x>=0 && x<arr.length && y>=0 && y<arr[0].length) { // ๋ฒ์ ์
if(arr[x][y].equals(find) && visited[x][y]==0) {
visited[x][y]=1;
queue.add(new int[] {x,y});
cnt+=1;
}
}
}
}
return cnt;
}
public static void main(String[] args) throws IOException{
BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
String s=bf.readLine();
int n=Integer.parseInt(s.split(" ")[0]); // ๊ฐ๋ก
int m=Integer.parseInt(s.split(" ")[1]); // ์ธ๋ก
String arr[][]=new String[m][n];
for(int i=0; i<m; i++) {
s=bf.readLine();
for(int j=0; j<n; j++) {
arr[i][j]=s.split("")[j];
}
}
int visited_w[][]=new int[m][n]; // ๋ฐฉ๋ฌธ ์ฌ๋ถ
int visited_b[][]=new int[m][n];
int cnt_w=0;
int cnt_b=0;
for(int i=0; i<m; i++) {
for(int j=0; j<n; j++) {
if(arr[i][j].equals("W") && visited_w[i][j]==0) {
int cnt=bfs(arr, visited_w, new int[] {i,j}, "W");
cnt_w+=(cnt*cnt);
}
if(arr[i][j].equals("B") && visited_b[i][j]==0) {
int cnt=bfs(arr, visited_b, new int[] {i,j}, "B");
cnt_b+=(cnt*cnt);
}
}
}
System.out.println(cnt_w +" "+ cnt_b);
}
}
์ํ์ข์ฐ๋ฅผ ํ์ธํ์ฌ ์์ ๊ณผ ๊ฐ์ ํ์ด๋ผ๋ฉด ๋ช ๋ช ์ธ์ง ๊ตฌํ ํ N ์ ๊ณฑ์ ๋ํด์ค๋๋ค.
- bfs ( ์
๋ ฅ ์ ๋ณด, ๋ฐฉ๋ฌธ ์ฌ๋ถ, ์์ ์์น, ์ฐพ๋ ๊ฐ 'W' or 'B' )
: ์ํ์ข์ฐ๋ฅผ ํ์ํ์ฌ ํ์ฌ ์์น์ ๊ฐ๊ณผ ๊ฐ์ ๊ฐ์ด๋ผ๋ฉด cnt๋ฅผ ์ฆ๊ฐ์์ผ์ฃผ๋ฉฐ ๊ณ์ํด์ ํ์ํด์ค๋๋ค. - Main
: ๊ฐ๋ก, ์ธ๋ก ์ ๋ ฅ
: arr ์ ๋ณด ์ ๋ ฅ
: visited_w, visited_b = ๋ฐฉ๋ฌธ ์ฌ๋ถ
: w_cnt, b_cnt = ๋ณ์ฌ์ ์๋ ฅ
: arr ์ ์ฒด๋ฅผ ์ํํ๋ฉฐ 'W'์ผ ๋์ 'B'์ผ ๋ bfs ํ์
-> ๋ฐํ ๊ฐ = ๋ญ์ณ ์๋ ์ ์ด๋ฏ๋ก ๊ฐ cnt์ ์ ๊ณฑํ ๊ฐ์ ๋ํจ
: w_cnt, b_cnt ์ถ๋ ฅ
โ ๋ฐํ์ ์๋ฌ?
๋ฌธ์ ์์ ๊ฐ๋ก, ์ธ๋ก ์์ผ๋ก ์ ๋ ฅ๋ฐ์๋๋ฐ ์ฒ์์ ์ฝ๋ ์์ฑ ์ ์ธ๋ก, ๊ฐ๋ก๋ก ํ์ฉํ๊ธฐ ๋๋ฌธ์ ์ธ๋ฑ์ค ์๋ฌ๊ฐ ๋ฐ์ํ์๋ค.
์๊ฐ๐ค
BFS๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๊ฒ ๊ตฌํ ์ ์๋ ๋ฌธ์ ์๋ค.
'๐Algorithm > ๐ฅBaekjoon' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Baekjoon] 14503_๋ก๋ด ์ฒญ์๊ธฐ (0) | 2022.05.05 |
---|---|
[Baekjoon] 2638_์น์ฆ (0) | 2022.04.27 |
[Baekjoon] 1747_์์&ํฐ๋ฆฐ๋๋กฌ (0) | 2022.04.25 |
[Baekjoon] 1743_์์๋ฌผ ํผํ๊ธฐ (0) | 2022.04.21 |
[Baekjoon] 1926_๊ทธ๋ฆผ (0) | 2022.04.20 |