풀이 방법은 크게 2가지로 생각해 볼 수 있을 것 같다.
첫번째는 파이썬의 permutations를 이용.
두번째는 dfs
가장 직관 적인 풀이는 다음과 같다.
import sys
from itertools import permutations
input = sys.stdin.readline
n = int(input())
a = list(map(int, input().split()))
cases = list(permutations(a))
answer = 0
for case in cases:
mid_sum = 0
for i in range(n - 1):
mid_sum += abs(case[i] - case[i + 1])
answer = max(mid_sum, answer)
print(answer)
다음으로 dfs 풀이는 다음과 같다.
import sys;input=sys.stdin.readline
n = int(input())
arr = list(map(int, input().split()))
def dfs(depth):
if depth == n:
result.append(sum(abs(explore[i] - explore[i + 1]) for i in range(n-1)) )
for i in range(n):
if visited[i]:
continue
explore.append(arr[i])
visited[i] = 1
dfs(depth + 1)
visited[i] = 0
explore.pop()
visited = [0] * n
result, explore = [], []
dfs(0)
print(max(result))
마자막으로 자바스크립트 풀이는 다음과 같다.
const input = require("fs")
.readFileSync("./dev/stdin")
.toString()
.trim()
.split("\n")
const n = +input[0]
const m = input[1].split(" ").map(Number)
const visited = Array.from({ length: n }, () => false)
const explore = []
let max = 0
function dfs(depth) {
if (depth == n) {
let temp = 0
for (let i = 0; i < n - 1; i++) {
temp += Math.abs(explore[i] - explore[i + 1])
}
if (temp > max) max = temp
}
for (let i = 0; i < n; i++) {
if (!visited[i]) {
visited[i] = true
explore.push(m[i])
dfs(depth + 1)
visited[i] = false
explore.pop()
}
}
}
dfs(0)
console.log(max)
'알고리즘 > 백준' 카테고리의 다른 글
15591. Mootube (0) | 2022.05.01 |
---|---|
1914. 하노이 탑 (0) | 2022.04.27 |
17299. 오등큰수 (0) | 2022.04.11 |
15681. 트리와 쿼리 (0) | 2022.04.07 |
2629. 양팔저울 (0) | 2022.04.06 |