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
- 배열
- 문자열다루기
- 스택
- 다이나믹프로그래밍
- 문자열
- BOJ
- 카카오블라인드
- 코틀린
- 안드로이드
- 트리
- Android
- 백준
- BFS
- 코딩테스트
- activity
- 완전탐색
- dfs
- 동적계획법
- 운영체제
- 코딩
- 이분탐색
- 그래프
- 생명주기
- GIT
- 프로그래머스
- 알고리즘
- 자바
- component
- 세그먼트트리
- 분할정복
Archives
- Today
- Total
HS_development_log
백준 4963번 - 섬의 개수 / Kotlin 본문
반응형
1. 문제
가장 기본적인 BFS 문제입니다. 다만 상하좌우 뿐만 아니라 대각선으로도 이동이 가능한 점과 가로 세로의 입력값이 일반적인 경우와 달리 반대로 되어있는 점만 유의하면 어렵지 않았습니다.
2. 알고리즘
-
BFS 방식으로 모든 칸을 검사한다.
-
상하좌우 뿐만 아니라 대각선으로도 이동이 가능하므로 주의한다.
-
한번의 BFS 탐색이 끝날때 마다 섬의 개수를 +1 해준다.
3. 코드
/**
* 2020.08.04
* DevHyeon
* BOJ4963 : 섬의 개수
*/
import java.util.*
fun main(){
val scan = Scanner(System.`in`)
var testCase = scan.nextLine()
while(testCase != "0 0"){
val w: Int // 행의 길이
val h: Int // 열의 길이
var answer = 0
testCase.split(" ").let {
w = it[0].toInt()
h = it[1].toInt()
}
var map = Array(h) { IntArray(w) } // 맵
var check = Array(h){ BooleanArray(w) } // 방문 체크
/* 배열 입력 받기 */
for(i in map.indices){
map[i] = IntArray(w)
check[i] = BooleanArray(w)
scan.nextLine().split(" ").let {
for (j in it.indices) {
map[i][j] = it[j].toInt()
}
}
}
for(i in map.indices){
for(j in map[i].indices){
if(!check[i][j] && map[i][j]==1){ // 방문 하지 않았고, 1 이라면 방문
check[i][j] = true // 방문 체크
bfs(check,map,i,j) // BFS 탐색
answer++
}
}
}
println(answer)
testCase = scan.nextLine()
}
}
fun bfs(check: Array<BooleanArray>, map: Array<IntArray>, i: Int, j:Int) {
val di = arrayOf(-1,0,1,0,-1,-1,1,1)
val dj = arrayOf(0,-1,0,1,-1,1,-1,1)
val q: Queue<Node> = LinkedList()
q.add(Node(i,j))
while(!q.isEmpty()){
q.poll().apply{
for(i in di.indices){
val dx = x+di[i]
val dy = y+dj[i]
if(dx>=0 && dy>=0 && dx<map.size && dy<map[0].size
&& !check[dx][dy] && map[dx][dy]==1){ // 상하좌우대각선 모두 검사. 배열의 범위와 방문 기록, 배열요소가 1인지 체크
q.offer(Node(dx,dy))
check[dx][dy] = true
}
}
}
}
}
data class Node(val x: Int, var y:Int)
끝.
반응형
'Algorithm-백준 > BFS,DFS' 카테고리의 다른 글
백준 10026번 - 적록색약 / Java (0) | 2020.08.27 |
---|---|
백준 6603 - 로또 / Java (0) | 2020.07.28 |
백준 7562번 - 나이트의 이동 / Java (0) | 2020.02.05 |
백준 7576번 - 토마토 / Java (0) | 2020.02.05 |
백준 13023번 - ABCDE / Java (0) | 2020.02.05 |