(Swift) 백준 2309 사탕 게임

SteadySlower·2022년 1월 12일
0

Coding Test

목록 보기
2/305
post-thumbnail

3085번: 사탕 게임

  • 개요
    • 알고리즘: 브루탈 포스
    • 난이도: 실버 3
  • 풀이
    • 사탕을 직접 바꾸어가면서 사탕의 갯수를 세야 합니다. (일정한 규칙이 없으므로 브루탈 포스)
    • 파이썬은 간단하게 이차원 리스트의 요소를 서로 바뀔 수 있었는데 스위프트는 그것보다는 좀 더 복잡한 과정을 거쳐야 합니다.
    • 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
}

// index번째 세로 줄을 반환해주는 함수
func column(index: Int) -> Array<Character> {
    var result: Array<Character> = []
    for i in 0..<N {
        result.append(board[i][index])
    }
    return result
}

// i, j에 있는 사탕을 이동 했을 때 먹을 수 있는 최대 사탕을 세는 함수 (이동했을 때 영향을 받은 부분만)
func getMaxCandy(i: Int, j: Int) -> Int {
    var maxCandy = 0
    
    // 현재 row과 하나 아랫 row에서 최대 사탕 구하기
    for a in 0..<2 {
        guard i + a < N else { break }
        maxCandy = max(countCandy(row: board[i + a]), maxCandy)
    }
    
    // 현재 column과 하나 아래 column에서 최대 사탕 구하기
    for a in 0..<2 {
        guard j + a < N else { break }
        maxCandy = max(countCandy(row: column(index: j + a)), maxCandy)
    }
    
    return maxCandy
}

// 0, 0에서 부터 오른쪽, 아래쪽 사탕과 자리 바꾸어 가면서 최대 사탕을 구하는 함수
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
}
profile
백과사전 보다 항해일지(혹은 표류일지)를 지향합니다.

0개의 댓글