devlog_zz

[BFS] javascript 백준 1926번 - 그림 본문

Problem Solved/BOJ

[BFS] javascript 백준 1926번 - 그림

YJ_SW 2023. 3. 6. 17:43
728x90

[BFS] javascript 백준 1926번 - 그림

문제
어떤 큰 도화지에 그림이 그려져 있을 때, 그 그림의 개수와, 그 그림 중 넓이가 가장 넓은 것의 넓이를 출력하여라. 단, 그림이라는 것은 1로 연결된 것을 한 그림이라고 정의하자. 가로나 세로로 연결된 것은 연결이 된 것이고 대각선으로 연결이 된 것은 떨어진 그림이다. 그림의 넓이란 그림에 포함된 1의 개수이다.

입력
첫째 줄에 도화지의 세로 크기 n(1 ≤ n ≤ 500)과 가로 크기 m(1 ≤ m ≤ 500)이 차례로 주어진다. 두 번째 줄부터 n+1 줄 까지 그림의 정보가 주어진다. (단 그림의 정보는 0과 1이 공백을 두고 주어지며, 0은 색칠이 안된 부분, 1은 색칠이 된 부분을 의미한다)

출력
첫째 줄에는 그림의 개수, 둘째 줄에는 그 중 가장 넓은 그림의 넓이를 출력하여라. 단, 그림이 하나도 없는 경우에는 가장 넓은 그림의 넓이는 0이다.

풀이

  1. 아이디어
    • 2중 for문 ⇒ 값 1 && 방문X ⇒ BFS
    • BFS 돌면서 그림 개수 + 1, 최대값 갱신
  2. 시간복잡도
    • BFS : O(V+E)
    • V = m*n
    • E = V * 4 ( 상,하,좌,우)
    • ⇒ V + 4V = 5V = 5(m*n) = 5 * (500 * 500) = 1250000 = 100만 ( 2억보다 작으니까 가능 )
    • m,n 최대 500이므로
  3. 자료구조
    • 그래프 전체 지도 : int[][]
    • 방문 : bool[][]
    • Queue : BFS
const n = 6
const m = 5
const graph = [
    [ 1, 1, 0, 1, 1],
    [0, 1, 1, 0, 0],
    [0, 0, 0, 0, 0],
    [1, 0, 1, 1, 1],
    [0, 0, 1, 1, 1],
    [0, 0, 1, 1, 1]
]
let visited = graph.map(row => row.map(r => {return false}))
const solution = () => {
    let count = 0
    let maxCount = 0
    for(let i = 0; i < n; i++){   
        for(let j = 0; j < m ; j++){
            if(graph[i][j] === 1 && !visited[i][j]){
                visited[i][j] = true
                count += 1 // 전체 그림 개수 + 1
                maxCount = Math.max(bfs(i,j),maxCount) // 그림 크기 구해주고, 최대값 갱신
            }
        }
    }
    console.log(count)
    console.log(maxCount)
}
const bfs = (i,j) => {
    let queue = []
    let cnt = 1
    let dx = [0,1,0,-1] // 우,하,좌,상
    let dy = [1,0,-1,0] // 우,하,좌,상
    queue.push([i,j])
    while(queue.length){
        const [ex,ey] = queue.shift()
        for(let k = 0 ; k < 4 ; k++){
            const nx = ex + dx[k]
            const ny = ey + dy[k]
            if(0 <= nx && nx < n && ny >=0 && ny < m){ // x좌표는 n을 넘으면 안되고, y좌표는 m을 넘으면 안된다.
                if(graph[nx][ny] === 1 && !visited[nx][ny]){
                    visited[nx][ny] = true
                    cnt += 1
                    queue.push([nx,ny])
                }
            }
        }
    }
    return cnt
    
}
solution()

 

https://www.acmicpc.net/problem/1926

https://www.youtube.com/watch?v=ansd5B27uJM&t=1132s 

 

728x90
Comments