본문 바로가기
Algorithm/문제풀이_백준

[Swift][구현] 백준 17406번 (배열 돌리기 4)

by Joahnee 2022. 5. 17.

요구능력

구현

 

문제풀이

핵심은 순열을 이용해서 연산순서를 정해줘야한다는것이다.

배열돌리는 부분은 급하게 순열로 변경하다보니 코드가 더러워졌다..

배열돌리는건 배열돌리기2와 동일하게 돌렸다.

 

시간나면 풀이올려야지..

혹시 궁금한점있으시면 댓글달아주시면 답변드리겠습니다.

 

후기

어려운문제는 아니었는데 문제에서 헷갈리게 임의로 정해도된다(?)라고 적혀있어서 시간이 걸렸다..

 

코드

let nmk = readLine()!.split(separator: " ").map{Int(String($0))!}
let n = nmk[0]
let m = nmk[1]
let k = nmk[2]

var arr = [[Int]]()
for _ in 0..<n{
    arr.append(readLine()!.split(separator: " ").map{Int(String($0))!})
}
var rcsArr = [[Int]]()
for _ in 0..<k{
    rcsArr.append(readLine()!.split(separator: " ").map{Int(String($0))!})
}
var visited = Array(repeating: false, count: rcsArr.count)
func dfs(_ depth: Int, _ arr: [[Int]]){
    if depth == k{
        for i in arr{
            result = min(result, i.reduce(0, +))
        }
        return
    }
    for i in 0..<rcsArr.count{
        if !visited[i]{
            visited[i] = true
            //가장위쪽 (r-s, c-s) 가장 아래쪽 (r + s, c + s)
            //그룹의 개수 : s
            var nm = 2 * rcsArr[i][2] + 1
            var copyArr = arr
            var temp = [Int]()
            let r = rcsArr[i][0]
            let c = rcsArr[i][1]
            let s = rcsArr[i][2]
            for g in 0..<rcsArr[i][2]{
                temp = rotate(g, rcsArr[i][0], rcsArr[i][1], rcsArr[i][2], nm, arr)
                let startX = r - s - 1
                let endX = r + s - 1
                let startY = c - s - 1
                let endY = c + s - 1
                var idx = 0
                for j in (startY + g)...endY-g{
                    copyArr[startX + g][j] = temp[idx]
                    idx += 1
                }
                for i in (startX + g + 1)...(endX-g){
                    copyArr[i][endY-g] = temp[idx]
                    idx += 1
                }
                for j in stride(from: endY-g-1, through: startY+g, by: -1){
                    copyArr[endX-g][j] = temp[idx]
                    idx += 1
                }
                for i in stride(from: endX-g-1, through: startX+g+1, by: -1){
                    copyArr[i][startY + g] = temp[idx]
                    idx += 1
                }
                nm -= 2
            }
            dfs(depth + 1, copyArr)
            visited[i] = false
        }
    }
}


func rotate(_ g: Int, _ r: Int, _ c: Int, _ s: Int, _ nm: Int, _ arr: [[Int]]) -> [Int]{
    let startX = r - s - 1
    let endX = r + s - 1
    let startY = c - s - 1
    let endY = c + s - 1
    //예시를 보면 (3,4,2)로 계산해보면 행이 1부터 5까지니까 2s + 1이됨.
    let length = (nm - 1) * 4
    var temp = Array(repeating: 0, count: length)
    var idx = 0
    for j in (startY + g)...endY-g{
        temp[(idx + 1) % length] = arr[startX + g][j]
        idx += 1
    }
    
    for i in (startX + g + 1)...(endX-g){
        temp[(idx + 1) % length] = arr[i][endY-g]
        idx += 1
    }
    
    for j in stride(from: endY-g-1, through: startY+g, by: -1){
        temp[(idx + 1) % length] = arr[endX-g][j]
        idx += 1
    }
    
    for i in stride(from: endX-g-1, through: startX+g+1, by: -1){
        temp[(idx + 1) % length] = arr[i][startY + g]
        idx += 1
    }

    return temp
}

var result = Int.max
dfs(0, arr)
print(result)

댓글