3085번: 사탕 게임
- 개요
- 풀이
- 사탕을 직접 바꾸어가면서 사탕의 갯수를 세야 합니다. (일정한 규칙이 없으므로 브루탈 포스)
- 파이썬은 간단하게 이차원 리스트의 요소를 서로 바뀔 수 있었는데 스위프트는 그것보다는 좀 더 복잡한 과정을 거쳐야 합니다.
- index out of range가 나지 않도록 꼼꼼하게 체크합시다!
- 코드
import Foundation
let N = Int(readLine()!)!
var board: Array<Array<Character>> = []
for _ in 0..<N {
board.append(Array(readLine()!))
}
print(solution())
func countCandy(row: Array<Character>) -> Int {
var result = 0
var i = 0
var count = 1
while i < N - 1 {
if row[i] == row[i + 1] {
count += 1
i += 1
} else {
result = max(count, result)
count = 1
i += 1
}
}
result = max(result, count)
return result
}
func column(index: Int) -> Array<Character> {
var result: Array<Character> = []
for i in 0..<N {
result.append(board[i][index])
}
return result
}
func getMaxCandy(i: Int, j: Int) -> Int {
var maxCandy = 0
for a in 0..<2 {
guard i + a < N else { break }
maxCandy = max(countCandy(row: board[i + a]), maxCandy)
}
for a in 0..<2 {
guard j + a < N else { break }
maxCandy = max(countCandy(row: column(index: j + a)), maxCandy)
}
return maxCandy
}
func solution() -> Int {
var answer = 0
var temp: Character
for i in 0..<N {
for j in 0..<N {
if j + 1 < N {
board[i].swapAt(j, j + 1)
answer = max(getMaxCandy(i: i, j: j), answer)
board[i].swapAt(j, j + 1)
}
if i + 1 < N {
temp = board[i][j]
board[i][j] = board[i + 1][j]
board[i + 1][j] = temp
answer = max(getMaxCandy(i: i, j: j), answer)
temp = board[i][j]
board[i][j] = board[i + 1][j]
board[i + 1][j] = temp
}
}
}
return answer
}