티스토리 뷰

생각

Github - https://github.com/hellojdh/Code/blob/master/src/baekjoon/q10000/Q10819.java 배열이 주어진다. 이 배열의 숫자들을 가지고 다음과 같은 계산을 한다. |A[0]-A[1]| + |A[1]-A[2]| + .... + |A[N-2]-A[N-1] 배열의 순서를 바꿧을 때, 위 계산의 최대값을 찾아라.


처음 생각

완전 탐색으로 기존 배열의 숫자들을 가지고 새로운 배열을 만들어 계산을 해주어야겠다는 생각이 먼저 들었다.


다음 생각

DFS를 사용해서 배열을 새로 만들어 주었다.

▶ N의 깊이로 들어가면서 각 단계마다 해당 단계를 새로운 배열의 인덱스로 사용하였다.

▶ 원본 배열의 해당 인덱스를 이전에 한 번 사용했다면 다음엔 사용해주면 안되므로, 방문 배열을 선언해준 뒤 원본 배열의 해당 인덱스를 사용시 방문 체크를 해주었다.


방안

1) 완전 탐색으로 풀어보았지만, 위의 계산에서 해당 값의 최대값을 찾는 문제이다. 따라서 값의 최대값을 얻으려면 각 계산의 차이가 클 수록 큰 값을 얻을 수 있을 것이다. 특히 앞에서부터보면 A[1]이 양쪽으로 중복되는 것을 볼 수 있다. 따라서 이 중복되는 값을 큰 값을 택해주고 양 옆을 작은 값을 택해주면 양 쪽다 큰 값을 얻을 수 있다.

▶ 이를위해 원본 배열을 오름차순으로 정렬한 뒤, 배열의 앞 뒤 값을 차례로 가져오면서 새로운 배열을 만들어주면 위와같은 아이디어를 적용할 수 있을 것 같다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package baekjoon.q10000;
 
import java.util.Scanner;
 
public class Q10819 {
    static int n;
    static int[] arr;
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        arr = new int[n];
        for(int i=0;i<n;i++)
            arr[i] = sc.nextInt();
        visited = new int[n];
        tArr = new int[n];
        result = 0;
        solve(0);
        System.out.println(result);
    }
    
    static int result;
    static int[] visited,tArr; // 방문 배열, 임시 배열
    private static void solve(int cnt) {
        // 배열이 만들어 지면
        if(cnt==n) {
            int sum = 0;
            // 만든 배열로 값 계산
            for(int i=0;i<n-1;i++)
                sum += Math.abs(tArr[i]-tArr[i+1]);
            // 최대값 찾기
            result = Math.max(result, sum);
            return;
        }
        
        
        for(int i=0;i<n;i++) {
            if(visited[i]==1continue
            visited[i] = 1// 방문 표시
            tArr[cnt] = arr[i]; // 새로운 배열 만들기
            solve(cnt+1);
            visited[i] = 0// 방문 해제
        }
    }
}


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

[백준] 15658번 연산자 끼워넣기(2)  (0) 2018.10.24
[백준] 14391번 종이 조각  (1) 2018.10.24
[백준] 4796번 캠핑  (0) 2018.10.21
[백준] 1182번 부분집합의 합  (0) 2018.10.20
[백준] 2503번 숫자 야구  (0) 2018.10.20
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday