알고리즘/백준

백준-10819번/차이를 최대로 (java)

연향동큰손 2024. 7. 6. 16:43

 

문제 접근

 

이 문제는 | A[0]-A[1] | + | A[1]-A[2] | ................ | A[N-2]-A[N-1] | 의 최대 값을 구해줘야 한다.

따라서 모든 경우의 수에 대한 결과 값을 비교해 보면서 최대값을 찾는 브루트포스 알고리즘을 이용해야한다.

 

문제 풀이

 

 

dfs를 이용하여 배열의 순서에 대한 경우를 구해준다.

public static void dfs(int count){
    if(count==N){
        result = Math.max(result,getResult());
        return;
    }
    for(int i=0; i<N; i++){
        if(!visited[i]){
            visited[i]=true;
            selected[count]=arr[i];
            dfs(count+1);
            visited[i]=false;
        }
    }
}

 

count가 N이 됐다는 것은 바뀐 순서의 배열인  selected배열이 다 찼다는 것을 의미 하므로 selected 배열에 대한 결과값을 구해줘야 한다.

public static int getResult(){
    int sum = 0;
    for(int i=0; i<N-1; i++){
        sum+=Math.abs(selected[i]-selected[i+1]);
    }
    return sum;
}

**** Math.abs(x,y) ===> | x - y |의 절대값 ******

 

위의 getResult 메서드를 통해 | A[0]-A[1] | + | A[1]-A[2] | ................ | A[N-2]-A[N-1] | 를 구해주면

하나의 바뀐 경우에 대한 결과값을 구한 것이 된다.

이러한 과정을 dfs를 통해 계속 반복하면 결과값을 구할 수 있다.

 

<전체 코드>

import javax.imageio.IIOException;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Scanner;
import java.util.StringTokenizer;

public class Problem10819 {
    static int result=Integer.MIN_VALUE; //정수의 최솟값
    static int N;
    static int[] arr,selected;
    static boolean[] visited;

    public static void main(String[] args) throws Exception {
        Scanner scanner = new Scanner(System.in);

        N=scanner.nextInt();
        arr=new int[N];
        visited = new boolean[N];
        selected = new int[N];

        for(int i=0; i<N; i++){
            arr[i]=scanner.nextInt();
        }

        dfs(0);
        System.out.println(result);
    }

    public static void dfs(int count){
        if(count==N){
            result = Math.max(result,getResult());
            return;
        }
        for(int i=0; i<N; i++){
            if(!visited[i]){
                visited[i]=true;
                selected[count]=arr[i];
                dfs(count+1);
                visited[i]=false;
            }
        }
    }
    public static int getResult(){
        int sum = 0;
        for(int i=0; i<N-1; i++){
            sum+=Math.abs(selected[i]-selected[i+1]);
        }
        return sum;
    }
}

 

 

느낀점 : 모든 경우에 대한 결과값을 비교할때는 dfs를 활용하자.

'알고리즘 > 백준' 카테고리의 다른 글

백준-14889번/스타트와 링크 (java)  (1) 2024.07.15
백준-14501번/퇴사 (java)  (0) 2024.07.07
백준-10973번/이전 순열 (java)  (0) 2024.07.05
백준-10972번/다음 순열 (java)  (0) 2024.07.03
백준-15649번/N과 M(2) (java)  (0) 2024.06.28