๐ŸŒžAlgorithm/๐Ÿ”ฅBaekjoon

[Baekjoon] 1303_์ „์Ÿ - ์ „ํˆฌ

๋ฟŒ์•ผ._. 2022. 4. 26. 12:15

Silver I

๋ฌธ์ œ(์ถœ์ฒ˜: 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๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‰ฝ๊ฒŒ ๊ตฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์˜€๋‹ค.