반응형
문제 출처 : https://www.acmicpc.net/problem/16956
문제
크기가 R×C인 목장이 있고, 목장은 1×1 크기의 칸으로 나누어져 있다. 각각의 칸에는 비어있거나, 양 또는 늑대가 있다. 양은 이동하지 않고 위치를 지키고 있고, 늑대는 인접한 칸을 자유롭게 이동할 수 있다. 두 칸이 인접하다는 것은 두 칸이 변을 공유하는 경우이다.
목장에 울타리를 설치해 늑대가 양이 있는 칸으로 갈 수 없게 하려고 한다. 늑대는 울타리가 있는 칸으로는 이동할 수 없다. 울타리를 설치해보자.
입력
첫째 줄에 목장의 크기 R, C가 주어진다.
둘째 줄부터 R개의 줄에 목장의 상태가 주어진다. '.'는 빈 칸, 'S'는 양, 'W'는 늑대이다.
출력
늑대가 양이 있는 칸으로 갈 수 없게 할 수 있다면 첫째 줄에 1을 출력하고, 둘째 줄부터 R개의 줄에 목장의 상태를 출력한다. 울타리는 'D'로 출력한다. 울타리를 어떻게 설치해도 늑대가 양이 있는 칸으로 갈 수 있다면 첫째 줄에 0을 출력한다.
제한
- 1 ≤ R, C ≤ 500
노트
이 문제는 설치해야 하는 울타리의 최소 개수를 구하는 문제가 아니다.
알고리즘 분류
풀이
간단한 그래프 탐색 문제이다.
dfs나 bfs 같은 그래프 탐색 알고리즘은 필요 없다.
그냥 2차원 그래프를 선형탐색하면서, 양이 있는 칸에 4방향으로 울타리를 치면 된다.
양이 있는 칸에 인접한 칸에 늑대가 있다면 그냥 0을 출력하면 된다.
진짜 그게 다다.
어려운 그래프 문제 손 맛좀 보려고 했는데 허탈한 문제였다.
코드
val dirXY = arrayOf(arrayOf(0,1),arrayOf(0,-1),arrayOf(1,0),arrayOf(-1,0))
val br = System.`in`.bufferedReader()
//s 양
//w 늑대
//양이나 늑대가 없을 수도 있음
fun main() = with(System.out.bufferedWriter()){
val (n,m) = br.readLine().split(' ').map{it.toInt()}
val graph = Array(n){ br.readLine().toCharArray() }
for(r in 0 until n){
for(c in 0 until m){
if(graph[r][c]=='S'){
for(i in 0 until 4){
val nr = r+dirXY[i][0]
val nc = c+dirXY[i][1]
if(nr !in 0 until n || nc !in 0 until m) continue
if(graph[nr][nc]=='W'){
write("0")
close()
return
}
if(graph[nr][nc]=='S') continue
graph[nr][nc]='D'
}
}
}
}
write("1\n")
for(i in 0 until n){
for(j in 0 until m){
write("${graph[i][j]}")
}
write("\n")
}
close()
}
반응형
'알고리즘 문제 풀이 > 백준' 카테고리의 다른 글
백준 17142 연구소 3 Kotlin (조합, bfs) (0) | 2021.12.30 |
---|---|
백준 10159 저울 Kotlin (dfs) (0) | 2021.12.29 |
백준 17425 약수의 합 Kotlin (에라토스테네스의 체, 누적 합) (0) | 2021.12.29 |
백준 16288 Passport Control Kotlin (그리디) (0) | 2021.12.29 |
백준 16982 뱀과 사다리 게임 Kotlin (bfs) (0) | 2021.12.29 |
댓글