BOJ-3085, 사탕 게임
문제 📑
https://www.acmicpc.net/problem/3085
문제 정리 ▾
- 보드의 크기(N)을 입력 받는다.
- 각 행엔 C(빨간색), P(파란색), Z(초록색), Y(노란색)으로 된 문자열을 개행 입력 받는다.
- 보드에서 한 가지 사탕만을 최대로 먹기 위해 인접한 칸의 다른 사탕과 바꾸려고 한다.
이때 최대로 먹을 수 있는 사탕의 개수를 출력한다.
접근 🚶🏻
나의 생각 ▾
- N의 최대 크기는 50으로 모든 경우를 따져볼 때 최대로 따지는 경우의 수는 50*50으로 브루트포스로 접근해도 무방할 거 같아 브루트포스로 구현해야겠다고 생각했다.
- 해당 문제를 각각 하나씩 원소를 바꿔주고 검사해보고 다시 원상태로 돌려놓으면서 모든 경우를 찾아보면 풀 수 있을 것이라고 생각했다.
내 코드 ▾
let n = Int(readLine()!)!
var candies = [[String]]()
var visited = Array(repeating: Array(repeating: false, count: n), count: n)
for _ in 0..<n {
candies.append(readLine()!.map{ String($0) })
}
// MARK: 값 바꿔주기
func swapValue(board: inout [[String]], _ i: Int, _ j: Int, _ mode: String) {
if mode == "col" {
let temp = board[i][j]
board[i][j] = board[i][j+1]
board[i][j+1] = temp
}
else if mode == "row" {
let temp = board[i][j]
board[i][j] = board[i+1][j]
board[i+1][j] = temp
}
}
// MARK: 사탕의 최대 개수 세기
func check(_ board: [[String]]) -> Int {
var cnt: Int = 0
var ans: Int = 1
for i in 0..<board.count {
cnt = 1
for j in 0..<board[i].count-1 {
if board[i][j] == board[i][j+1] { cnt += 1 }
else { cnt = 1 }
ans = max(ans, cnt)
}
cnt = 1
for j in 0..<board[i].count-1 {
if board[j][i] == board[j+1][i] { cnt += 1 }
else { cnt = 1 }
ans = max(ans, cnt)
}
}
return ans
}
var result: Int = 0
for i in 0..<n {
for j in 0..<n {
if j < n-1 {
swapValue(board: &candies, i, j, "col")
result = max(check(candies), result)
swapValue(board: &candies, i, j, "col")
}
if i < n-1 {
swapValue(board: &candies, i, j, "row")
result = max(check(candies), result)
swapValue(board: &candies, i, j, "row")
}
}
}
print(result)
Addtional 📂
- check 함수에서 cnt 초기화를 해주는걸 깜빡해서 오래 걸렸다..
- 맞왜틀 맞왜틀...
- 앞으로 코드를 짤 때 더욱 신중하게 풀어야겠다..
'Algorithm.zip' 카테고리의 다른 글
[Swift]BOJ-3190 (0) | 2022.07.12 |
---|---|
[Swift]BOJ-1744 (0) | 2022.04.07 |
[Swift]BOJ-16953 (0) | 2022.04.06 |
[Swift]BOJ-1946 (0) | 2022.04.06 |
[Swift]BOJ-1026 (0) | 2022.04.04 |