Week 01 ~ 04 : 알고리즘 문제 풀이

파이썬 백준 10819 차이를 최대로

정글러 2021. 11. 9. 19:34
n = int(input())
testset = list(map(int, input().split()))
rearrlist = [[] for i in range(n)]

# 원소 1개의 rearrlist 생성
for i in range(n) :
    rearrlist[0].append([testset[i]])

# 원소 x개의 rearrlist를 참고하여 원소 x+1개의 rearrlist를 작성
# 원소 n개가 될때까지
for x in range (0, n-1) :
    for list in rearrlist[x] :
        remainder = testset[:]
        for e in list :
            remainder.remove(e)
        for element in testset :
            if element in remainder :
                rearrlist[x+1].append(list + [element])
max = 0
for list in rearrlist[n-1] :
    abssum = 0
    for i in range(len(list) - 1) :
        abssum = abssum + abs(list[i]-list[i+1])
    if abssum > max :
        max = abssum
print(max)

n개의 정수를 재정렬하는 n!가지의 경우의 수를 전부 리스트에 담았고, 하나하나 sum(abs)를 구하면서 max를 찾았다.

n!가지 재정렬을 리턴하는 함수는 뭔가 그럴듯한걸 import하면 남이 구현한걸 쓸수있을것같기도 한데 찾아도 바로 안나와서 패스했다.

생각없이 모든 경우를 다 따지는 방법이 코드 짜기도 쉽고 논리적으로 허점이 생길 일도 없어서 마음이 놓인다. 

그리고 뭔가 초과가 뜨면 그제서야 다른 방법을 찾는 상황의 반복