Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- getline
- 백준 10172
- 값삭제
- barplot in r
- 백준 11718
- R 그래프
- 데이터분석
- 배열추가
- asynchronization
- await
- barplot
- R데이터형태
- 10172
- 그대로 출력하기
- 값추가
- useState
- 탈출문자
- 배열삭제
- react #회원가입 #비밀번호비교
- React
- plot in r
- 광명시버스분석
- DataFrame
- 백준
- vetor
- 버스분석
- 그래픽
- 이스케이프시퀀스
- 이용현황분석
- setstate
Archives
- Today
- Total
devlog_zz
[BFS] javascript 백준 1926번 - 그림 본문
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
'Problem Solved > BOJ' 카테고리의 다른 글
[DP] node.js 백준 10844번 - 쉬운 계단 수 (0) | 2024.01.21 |
---|---|
[DP] node.js 백준 11726번 - 2×n 타일링 (0) | 2024.01.18 |
[시뮬레이션] python 백준 14499번 - 주사위 굴리기 (0) | 2022.07.26 |
[완전탐색] python 백준 13458번 - 시험 감독 (0) | 2022.07.12 |
[DP] python 백준 1463번 - 1로 만들기 (0) | 2022.07.12 |
Comments