끄적끄적 코딩
article thumbnail

수열이 주어질때 규칙에 따라 등차수열로 변화시킬 수 있는지 찾는 문제입니다.

등차수열은 수열의 수의 앞뒤의 차가 전부 같은 수열을 말합니다.
수열이 주어지고 각 수에 1을 빼거나 1을 더할 수 있습니다.

가능한 경우
1. 현재 수 1 빼기
2. 현재 수 그대로 사용
3. 현재 수 1 더하기

위의 3가지 경우를 모두 DFS로 탐색하였습니다.
그리고 이전의 값과 차가 동일하면 계속 DFS로 탐색합니다.

가능한 경우들이 여러개가 나오는데 최소의 연산을 한 경우를 출력해주었습니다.

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;

public class Main {
  static int result = 987654321;

  public static void main(String[] args) throws Exception {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

    int n = Integer.parseInt(br.readLine());
    int arr[] = new int[n];

    StringTokenizer st = new StringTokenizer(br.readLine());
    for (int i = 0; i < n; ++i) {
      arr[i] = Integer.parseInt(st.nextToken());
    }

    if (n <= 2) {
      result = 0;
    } else {
      dfs(arr, 2, arr[0] - 1 - (arr[1] - 1), arr[1] - 1, 2);
      dfs(arr, 2, arr[0] - 1 - arr[1], arr[1], 1);
      dfs(arr, 2, arr[0] - (arr[1] - 1), arr[1] - 1, 1);

      dfs(arr, 2, arr[0] + 1 - (arr[1] - 1), arr[1] - 1, 2);
      dfs(arr, 2, arr[0] - arr[1], arr[1], 0);
      dfs(arr, 2, arr[0] - 1 - (arr[1] + 1), arr[1] + 1, 2);

      dfs(arr, 2, arr[0] + 1 - (arr[1] + 1), arr[1] + 1, 2);
      dfs(arr, 2, arr[0] + 1 - arr[1], arr[1], 1);
      dfs(arr, 2, arr[0] - (arr[1] + 1), arr[1] + 1, 1);

      result = result == 987654321 ? -1 : result;
    }

    bw.write(result + "");
    bw.close();
  }

  public static void dfs(int[] arr, int index, int num, int prev, int cnt) {
    if (arr.length == index) {
      result = Math.min(result, cnt);
      return;
    }
    if (prev - arr[index] == num) {
      dfs(arr, index + 1, num, arr[index], cnt);
    }
    if (prev - (arr[index] + 1) == num) {
      dfs(arr, index + 1, num, (arr[index] + 1), cnt + 1);
    }
    if (prev - (arr[index] - 1) == num) {
      dfs(arr, index + 1, num, (arr[index] - 1), cnt + 1);
    }
  }
}

'알고리즘' 카테고리의 다른 글

[Java] 백준 9080번 PC방 요금  (1) 2023.06.23
[Java] 백준 16432번 떡장수와 호랑이  (0) 2023.06.23
[Java] 백준 12904번 A와 B  (0) 2023.06.22
[Java] 백준 17609번 회문  (0) 2023.06.22
[Java] 백준 16938번 캠프 준비  (0) 2023.06.21

검색 태그