본문 바로가기
알고리즘

[Swift 알고리즘] 백준 3085 사탕 게임

by 코코종 2023. 4. 12.
728x90

안녕하세요 코코종입니다

주말과 월화를 건너뛰고 왔네여 ㅋㅋㅋㅋㅋㅋ 주말에는 놀았고 월화에는 고뿔 이슈로 쉬었답니다.. 그래서 오늘은 2문제를 풀어봤어요!(시간이 남는다면 하나 더 푸는거로)

import Foundation
let n = Int(readLine()!) ?? 0
var board: [[Character]] = []
for _ in 0..<n {
    board.append(Array(readLine()!))
}

var answer = 0

func changeBoard(_ board: [[Character]], r: Int, c: Int) {
    var changedBoard = board
    let dx = [-1, 0, 1, 0] // column
    let dy = [0, 1, 0, -1] // row
    for i in 0..<4 {
        let rr = r + dy[i]
        let cc = c + dx[i]
        if rr >= 0 && rr < n && cc >= 0 && cc < n {
            changedBoard[rr][cc] = board[r][c]
            changedBoard[r][c] = board[rr][cc]
//            print(r,c, rr, cc, ":", cntRowMax(changedBoard), cntColumnMax(changedBoard))
//            print(r, c, rr, cc, changedBoard)
            answer = max(answer, cntRowMax(changedBoard), cntColumnMax(changedBoard))
            
        }
    }
}

func cntRowMax(_ board: [[Character]]) -> Int {
    var maxCnt = 0
    for i in 0..<n {
        var rowCnt = 1
        for j in 0..<n-1 {
            if board[i][j] == board[i][j+1] {
                rowCnt += 1
            } else  {
                maxCnt = max(maxCnt, rowCnt)
                rowCnt = 1
            }
        }
    }
    return maxCnt
}

func cntColumnMax(_ board: [[Character]]) -> Int {
    var maxCnt = 0
    for i in 0..<n {
        var columnCnt = 1
        for j in 0..<n-1 {
            if board[j][i] == board[j+1][i] {
                columnCnt += 1
            } else {
                maxCnt = max(maxCnt, columnCnt)
                columnCnt = 1
            }
        }
    }
    return maxCnt
}

for i in 0..<n {
    for j in 0..<n {
        changeBoard(board, r: i, c: j)
    }
}

print(answer)

네;.. 또 틀린 풀이 먼저 가져왔습니다 >< 맞는데 뭐가 틀렸냐고 계속 얘랑 눈싸움을 하다가 알아냈는데요...

아마 열어분들도 '맞왜틀??' 하다가 여기까지 흘러들어오신게 아닐까 합니다

(아 그리고 처음에 문제를 잘못 읽어서 행, 열 만 보는게 아니라 다른 bfs문제처럼 막 넓혀가면서 풀다가 문제를 다시 읽었네요 ㅋㅋ)

 

어디가 틀렸다면 바로바로 changedBoard를 초기화 하는 부분이 틀렸답니닷.. 하하.. 지금처럼 되어있으면 이전에 바뀐것도 changedBoard에 적용되어버려서 뒤죽박죽 엉망진창이 되어버린다구엿... ㅜㅜ 하나씩 print 찍으면서 찾았습니다...

 

그리고 또 행, 열에서 최댓값을 구할때 계속 같은거면 maxCnt를 갱신해주지 않았더라구요 ^^... 망충망충

import Foundation

let n = Int(readLine()!) ?? 0
var board: [[Character]] = []
for _ in 0..<n {
    board.append(Array(readLine()!))
}

var answer = 0

func changeBoard(_ board: [[Character]], r: Int, c: Int) {
    let dx = [-1, 0, 1, 0] // column
    let dy = [0, 1, 0, -1] // row
    for i in 0..<4 {
        let rr = r + dy[i]
        let cc = c + dx[i]
        if rr >= 0 && rr < n && cc >= 0 && cc < n {
            var changedBoard = board // 놓친 부분 -> 4방향으로 갈때마다 보드를 초기화 해야하는데 그전에 초기화해서 정보가 남아버림..
            changedBoard[rr][cc] = board[r][c]
            changedBoard[r][c] = board[rr][cc]
            answer = max(answer, cntRowMax(changedBoard), cntColumnMax(changedBoard))
        }
    }
}

func cntRowMax(_ board: [[Character]]) -> Int {
    var maxCnt = 0
    for i in 0..<n {
        var rowCnt = 1
        for j in 0..<n-1 {
            if board[i][j] == board[i][j+1] {
                rowCnt += 1
            } else  {
                maxCnt = max(maxCnt, rowCnt)
                rowCnt = 1
            }
        }
        maxCnt = max(maxCnt, rowCnt) // 놓쳤던 부분 - 계속 같은거면 maxCnt가 갱신이 안댐
    }
    return maxCnt
}

func cntColumnMax(_ board: [[Character]]) -> Int {
    var maxCnt = 0
    for i in 0..<n {
        var columnCnt = 1
        for j in 0..<n-1 {
            if board[j][i] == board[j+1][i] {
                columnCnt += 1
            } else {
                maxCnt = max(maxCnt, columnCnt)
                columnCnt = 1
            }
        }
        maxCnt = max(maxCnt, columnCnt) // 놓쳤던 부분 - 계속 같은거면 maxCnt가 갱신이 안댐
    }
    return maxCnt
}

for i in 0..<n {
    for j in 0..<n {
        changeBoard(board, r: i, c: j)
    }
}

print(answer)

주석으로 해당 부분에 대한 설명을 달아두었습니다! 참고해보시와요~

728x90