차이를 최대로 - 완전 탐색

조해빈·2023년 3월 16일
0

백준

목록 보기
26/53

차이를 최대로 - 10819번

문제

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

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

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

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

풀이

다음의 코드는 정답이다.

순열

import sys
from itertools import permutations
input = sys.stdin.readline
N = int(input())
A = list(map(int, input().split()))
perms = []
for p in permutations(A, N):
    perms.append(p)

currMax = -1e999
tmp = 0

for p in perms:
    tmp = 0
    for i in range(N-1):
        tmp += abs(p[i] - p[i+1])
    if tmp > currMax:
        currMax = tmp

print(currMax)

완전탐색(재귀)

import sys
input = sys.stdin.readline
N = int(input())
A = list(map(int, input().split()))
currMax = -1e999
visited = [0]*N
arr = []
sum = 0

def dfs(depth):
    global sum, currMax
    if depth==N:
        for i in range(N-1):
            sum += abs(arr[i]-arr[i+1])
        if sum>currMax:
            currMax = sum
        sum = 0
        return
    for i in range(N):
        if visited[i]==0:
            arr.append(A[i])
            visited[i] = 1
            dfs(depth+1)
            arr.pop()
            visited[i] = 0
dfs(0)
print(currMax)

지난 번 문제풀이 때 itertools 라이브러리의 순열로 풀 수 있는 문제는 고대로 재귀로 순열을 만들어서 푸는 식으로 접근했었던 기억이 있는데 이번엔 그렇게 하지 않았다.

카드놓기 문제(https://velog.io/@hbtopkr/%EC%B9%B4%EB%93%9C-%EB%86%93%EA%B8%B0-%EC%9E%AC%EA%B7%80%ED%95%A8%EC%88%98-%EC%9E%85%EB%AC%B8%EC%9D%84-%EC%9C%84%ED%95%9C-%EC%88%9C%EC%B0%A8%EC%A0%81-%EB%94%94%EB%B2%84%EA%B9%85)를 열심히 들여다 보았었는데, 이런 식으로 방문 혹은 활용의 체크를 표시를 표시했다가 지웠다가 하는 기법으로 탐색하는 문제가 많은 것 같다. 이 문제 역시 같은 접근이라 이해가 바로 됐다.

아래 for문에서가 아니라 탈출용 if문 안에서 sum을 만들어 currMax와 비교대조하는 등의 많은 수행을 하도록 적은 점이 내겐 새로웠다.

profile
JS, CSS, HTML, React etc

0개의 댓글

관련 채용 정보