https://school.programmers.co.kr/learn/courses/30/lessons/120866
문제
다음 그림과 같이 지뢰가 있는 지역과 지뢰에 인접한 위, 아래, 좌, 우 대각선 칸을 모두 위험지역으로 분류합니다.
지뢰는 2차원 배열 board에 1로 표시되어 있고 board에는 지뢰가 매설된 지역 1과, 지뢰가 없는 지역 0만 존재합니다.
지뢰가 매설된 지역의 지도 board가 매개변수로 주어질 때, 안전한 지역의 칸 수를 return 하도록 solution 함수를 완성해 주세요.
제한사항
board는 n * n 배열입니다.
1 ≤ n ≤ 100
지뢰는 1로 표시되어 있습니다.
board에는 지뢰가 있는 지역 1과 지뢰가 없는 지역 0만 존재합니다.
풀이
class Solution {
fun solution(board: Array<IntArray>): Int {
var answer = 0
val size = board.size
val save = Array(size + 2) { BooleanArray(board[0].size + 2) }
for (i in 0 until size) {
for (j in 0 until size) {
if (board[i][j] == 1) {
for (a in i..i + 2) {
for (b in j..j + 2) {
save[a][b] = true
}
}
}
}
}
for (i in 1..size) {
for (j in 1..size) {
if (save[i][j]) answer++
}
}
return size*size - answer
}
}
- 해당문제는 결과적으로 안전한 곳을 카운트하여 그값을 반환하라는 내용과 같습니다. 이런 문제에서는 위험한 곳을 저장해 놓을 공간이 필요합니다. 여기서는 지뢰가 있는 자표의 한지점을 기준으로 그 주위를 위험한 곳으로 표시를 해야 합니다. 그렇지만 양끝의 경우 끝인 부분에는 표시를 할 공간이 없기 때문에 표시를 할 때마다 조건문으로 검사를 해줘야 합니다. 그렇지 않을 경우 IndexOutOfBounds라는 예외가 생기게됩니다. 하지만 이러한 로직은 매번 검사를 해야 된다는 것 때문에 시간을 더 차지하게 됩니다. 그렇다면 이러한 문제의 해결방안으로 양끝을 한 칸씩 늘려준다면 IndexOutOfBounds라는 예외가 생기지 않게됩니다. 위코드는 이러한 로직을 구현한 코드입니다.
결과
'코틀린 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] - 문자열 내 마음대로 정렬하기 (Kotlin) (0) | 2023.08.02 |
---|---|
[프로그래머스] - 평행 (Kotlin) (0) | 2023.08.01 |
[프로그래머스] - 캐릭터의 좌표(Kotlin) (0) | 2023.08.01 |
[프로그래머스] - 겹치는 선분의 길이(Kotlin) (0) | 2023.07.31 |
[프로그래머스] - 캐릭터의 좌표(Kotlin) (0) | 2023.07.31 |