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이다.
풀이
- 아이디어
- 2중 for문 ⇒ 값 1 && 방문X ⇒ BFS
- BFS 돌면서 그림 개수 + 1, 최대값 갱신
- 시간복잡도
- 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이므로
- 자료구조
- 그래프 전체 지도 : 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