문제

N개의 정수로 이루어진 배열 A가 주어진다. 이때, 배열에 들어있는 정수의 순서를 적절히 바꿔서 다음 식의 최댓값을 구하는 프로그램을 작성하시오.

|A[0] - A[1]| + |A[1] - A[2]| + ... + |A[N-2] - A[N-1]|

입력

첫째 줄에 N (3 ≤ N ≤ 8)이 주어진다. 둘째 줄에는 배열 A에 들어있는 정수가 주어진다. 배열에 들어있는 정수는 -100보다 크거나 같고, 100보다 작거나 같다.

출력

첫째 줄에 배열에 들어있는 수의 순서를 적절히 바꿔서 얻을 수 있는 식의 최댓값을 출력한다.

내가 푼 풀이

- 백트래킹을 이용해서 주어진 A배열 순서의 모든 경우의수를 구해서 최대값을 갱신한다.

 

import Foundation

//입력받기
let N = Int(readLine()!)!
var arr = readLine()!.split(separator: " ").map{Int(String($0))!}
var result = 0
var visited = Array(repeating: false, count: N)

// DFS 백트래킹
func dfs(count: Int, nums: [Int]) {
    if count == N {
        result = max(result, sum(nums: nums))
        return
    }
    
    for i in 0..<N {
        if !visited[i] {
            visited[i] = true
            dfs(count: count+1, nums: nums + [arr[i]])
            visited[i] = false
        }
    }
}

// 합산
func sum(nums: [Int]) -> Int{
    var sum = 0
    for i in 0..<nums.count-1 {
        sum += abs(nums[i] - nums[i+1])
    }
    return sum
}

dfs(count: 0, nums: [])
print(result)

'코딩테스트 > 백준' 카테고리의 다른 글

BOJ-10974 모든 순열 Swift  (0) 2024.04.13
BOJ-15683 감시 Swift  (1) 2024.04.12
BOJ-12100 2048(Easy) Swift  (0) 2024.04.12
BOJ-2003 수들의 합 2 Swift  (0) 2024.04.11
BOJ-1107 리모컨 Swift  (0) 2024.04.11

+ Recent posts