문제
풀이
for문을 통해 입력받은 배열을 탐색하며 각 위치에서 현재 색상을 기준으로 아래쪽이나 오른쪽을 바꾸어 가며 확인해주면 된다. 연속된 동일한 색을 찾는 함수에서는 가로 방향과 세로 방향으로 색을 확인해 준다,
코드
import kotlin.math.*
fun main() {
val br = System.`in`.bufferedReader()
val bw = System.out.bufferedWriter()
// 오른쪽, 아래로 이동하는 배열
val dx = arrayOf(1, 0)
val dy = arrayOf(0, 1)
val num = br.readLine().toInt()
val map = Array(num){ br.readLine().toCharArray() }
fun countMatches(row: Int, col: Int): Int {
var cntRow = 1 // 가로 방향 연속된 색상 개수
var cntCol = 1 // 세로 방향 연속된 색상 개수
// 가로 방향으로 같은 색상 확인
var r = row - 1
while (r >= 0 && map[r][col] == map[row][col]) {
cntRow++
r--
}
r = row + 1
while (r < num && map[r][col] == map[row][col]) {
cntRow++
r++
}
// 세로 방향으로 같은 색상 확인
var c = col - 1
while (c >= 0 && map[row][c] == map[row][col]) {
cntCol++
c--
}
c = col + 1
while (c < num && map[row][c] == map[row][col]) {
cntCol++
c++
}
return max(cntRow, cntCol)
}
var max = 0
for (i in 0 until num) {
for (j in 0 until num) {
max = max(max, countMatches(i, j)) // 모든 위치에서의 연속된 동일한 색상 개수 중 최대값 찾기
for (d in 0 until 2) {
val nx = i + dx[d]
val ny = j + dy[d]
if (nx >= num || ny >= num) continue // 체스판 범위를 벗어나면 건너뛰기
if (map[i][j] == map[nx][ny]) continue // 두 위치의 색상이 같으면 건너뛰기
// 두 위치의 색상 바꾸기
val tmp = map[i][j]
map[i][j] = map[nx][ny]
map[nx][ny] = tmp
// 바꾼 후의 연속된 동일한 색상 개수를 확인하고 최대값 업데이트
max = max(max, max(countMatches(i, ny), countMatches(nx, j)))
// 다시 색상 원래대로 복구
map[nx][ny] = map[i][j]
map[i][j] = tmp
}
}
}
bw.write("$max")
bw.flush()
bw.close()
br.close()
}
'알고리즘 > Baekjoon' 카테고리의 다른 글
[백준] 12015번: 가장 긴 증가하는 부분 수열 2 - Kotlin[코틀린] (0) | 2023.10.16 |
---|---|
[백준] 11053번: 가장 긴 증가하는 부분 수열 - Kotlin[코틀린] (0) | 2023.10.14 |
[백준] 1018번: 체스판 다시 칠하기 - Kotlin[코틀린] (0) | 2023.10.04 |
[백준] 1193번: 분수찾기 - Kotlin[코틀린] (0) | 2023.09.30 |
[백준] 15649 ~ 15666번: N과 M (2) ~ (12) - Kotlin[코틀린] (0) | 2023.09.29 |