https://www.acmicpc.net/problem/10819

 

10819번: 차이를 최대로

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

www.acmicpc.net


    • 숫자가 최대 8개 밖에 되지 않기 떄문에, 완전탐색으로 전부 검사 가능하다.
    • 백트래킹을 통해 하나의 재귀호출마다 자릿수 하나를 채워넣는다.
    • 첫 자리의 값을 N 개 중 하나로 결정하면, 두번째 자리로 들어가 나머지 N-1 개 중 하나를 뽑고, 세번째 자리에서는 N-2 개 중 하나를 뽑는 식으로 재귀가 들어간다.
    • permutation 관련 함수들을 사용해도 괜찮을 것 같다.

#include <iostream>

using namespace std;

int N;
int values[8];      // 입력 값들
int answer[8];      // N 개 순서를 바꿔가며 뽑아줄 배열
bool visit[8];      // 뽑을 때 중복되지 않게 관리해주는 배열
int maxi = 0;

void select_next(int depth)
{
    if(depth == N)                          // N 개를 다 뽑았다면
    {
        int temp = 0;
        for(int i = 0 ; i < N-1 ; i++)      // 수식에 맞는 값 구하고
        {
            temp += abs(answer[i] - answer[i+1]);
        }
        if(temp > maxi) maxi = temp;        // 최댓값 갱신
        return;
    }

    for(int i = 0 ; i < N ; i++)            // 이번 자릿수의 값 선택
    {
        if(visit[i]) continue;              // 앞에서 뽑힌 값이라면 넘어감
        visit[i] = true;
        answer[depth] = values[i];          // 이번 자릿수에서 값 넣어주고
        select_next(depth + 1);             // 다음 자릿수의 값 선택
        visit[i] = false;
    }
}

int main(void)
{
    cin >> N;
    for(int i = 0 ; i < N ; i++) cin >> values[i];
    select_next(0);
    cout << maxi << endl;
}

'PS > BOJ' 카테고리의 다른 글

[백준] 4485 : 녹색 옷 입은 애가 젤다지?  (0) 2021.05.23
[백준] 11444 : 피보나치 수 6  (0) 2021.05.22
[백준] 13172 : Σ  (0) 2021.05.19
[백준] 9935 : 문자열 폭발  (0) 2021.05.18
[백준] 11055 : 가장 큰 증가 부분 수열  (0) 2021.05.17

+ Recent posts