728x90
[깃허브]
[백준]
https://www.acmicpc.net/problem/14503
정답 비율이 50퍼가 넘는 문제여서 그런지 생각보다 쉽게 풀었다.
문제에 조건이 많았지만 순서대로 진행하면 풀리더라
나는 계속 로봇 청소기가 쭉쭉 움직이면서 더 이상 청소 못할 때까지 작동하는 걸 보고 DFS가 생각나더라(이게 코딩하는 사람의 마음인가...?)
그래서 가장 먼저 DFS로 도전했고 어떻게 DFS를 짰었는지 생각이 안 나서 예전에 풀었었던 DFS문제들을 보며 재활훈련을 잠시 했다.
그런데 그 때랑 조금 다르게 접근한건 visited배열을 사용하지 않았다는 것이다.
그냥 주어진 2차원 배열 값을 변경시키면서 해결했다.
모든 입력값은 전역으로 받아 다른 함수들에서도 편하게 값을 변경했다.
이렇게 할 수 있었던 것은 DFS이지만 깊숙히 들어갔다가 다시 돌아오는 케이스가 없었기 때문이었다.
이런 측면에서 본다면 DFS 안 쓰고 반복문을 썼어도 됐을 거 같기는 하다.
가장 큰 분기점은 주변 4칸에 청소가 안 된 곳이 있는가여서 따로 함수를 만들었다.
그리고 그 안의 세부 조건은 when문으로 처리했다.
좀 많이 길어지긴 했지만...
그렇다고 어떻게 묶을 방법이 보이지가 않았다.
그렇게 0인 자리에 도착하면 count를 올리는 것으로 문제는 해결했고 한번에 통과했다.
해당 방법으로 작성한 코드는 다음과 같다.
import java.util.StringTokenizer
var count = 0
var n = 0
var m = 0
var r = 0
var c = 0
var d = 0
var room = Array(50) { Array(50) { 0 } }
fun main() = with(System.`in`.bufferedReader()) {
with(StringTokenizer(readln())) {
n = nextToken().toInt()
m = nextToken().toInt()
}
with(StringTokenizer(readln())) {
r = nextToken().toInt()
c = nextToken().toInt()
d = nextToken().toInt()
}
for (i in 0 until n) {
with(StringTokenizer(readln(), " ")) {
for (j in 0 until m) {
room[i][j] = nextToken().toInt()
}
}
}
solve()
println(count)
}
fun checkClean(): Boolean {
return room[r + 1][c] != 0 && room[r][c + 1] != 0 && room[r - 1][c] != 0 && room[r][c - 1] != 0
}
fun solve() {
if (room[r][c] == 0) {
room[r][c] = -1
++count
}
if (checkClean()) {
when (d) {
0 -> {
if (room[r + 1][c] == 1) {
return
} else {
r += 1
}
}
1 -> {
if (room[r][c - 1] == 1) {
return
} else {
c -= 1
}
}
2 -> {
if (room[r - 1][c] == 1) {
return
} else {
r -= 1
}
}
3 -> {
if (room[r][c + 1] == 1) {
return
} else {
c += 1
}
}
}
solve()
} else {
d = when (d) {
0 -> {
if (room[r][c - 1] == 0) c -= 1
3
}
1 -> {
if (room[r - 1][c] == 0) r -= 1
0
}
2 -> {
if (room[r][c + 1] == 0) c += 1
1
}
3 -> {
if (room[r + 1][c] == 0) r += 1
2
}
else -> -1
}
solve()
}
}
반응형
'Kotlin > Algorithm Problems' 카테고리의 다른 글
<백준> 신기한 소수(Gold 5) (1) | 2024.01.31 |
---|---|
<프로그래머스> 광물 캐기(Lv.2) (0) | 2024.01.30 |
<프로그래머스> 거리두기 확인하기(Lv.2) (1) | 2024.01.26 |
<백준> 톱니바퀴(Gold 5) (1) | 2024.01.25 |
<백준> 빗물(Gold 5) (1) | 2024.01.24 |