Problem Solving/Baekjoon
[백준] 17088 등차수열 변환 - Brute Force / Java
graycode
2022. 8. 10. 21:56
• 문제 링크
17088번: 등차수열 변환
크기가 N인 수열 A = [A1, A2, ..., AN]이 있을 때, 모든 1 ≤ i < N에 대해서, Ai+1-Ai가 모두 일치하면 등차수열이라고 한다. 예를 들어, [3], [6, 6, 6], [2, 8, 14, 20], [6, 4, 2]는 등차수열이고, [4, 5, 4], [6, 3, 1]
www.acmicpc.net
• 풀이 과정
등차수열의 공차는 모든 항에 대해서 일치하므로,
수열의 첫째, 둘째 항의 공차의 값에 따라 다른 모든 항의 공차를 일치하게 연산할 수 있는지 확인한다.
첫째, 둘째 항 각각에 -1, 0, 1 를 더하는 경우, 즉 3 * 3 = 9가지의 경우를 가지므로
2중 for문 내부에 clone() 함수를 통해 배열을 초기화하여 각각의 경우의 공차를 구한다.
해당 공차가 나머지 2 ~ n 번째 항의 공차와 일치하는지 검사하며,
항에 더하는 값이 0 이 아닐 시 연산을 적용한 것이므로
각각의 연산의 횟수 cnt 변수에 cnt++ 을 수행한다.
이렇게 모든 항에 대하여 공차의 일치 여부에 따라 연산의 횟수의 최솟값 min 과 구해진 cnt 를 비교 및 갱신하여,
최종적으로 min 값을 정답으로써 출력한다.
• 풀이 코드
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
public class Main {
static int n, cnt;
static int[] arr;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st;
n = Integer.parseInt(br.readLine());
if (n == 1) {
bw.write(0 + "\n");
bw.flush();
return;
}
int[] input = new int[n];
st = new StringTokenizer(br.readLine());
for (int i = 0; i < n; i++)
input[i] = Integer.parseInt(st.nextToken());
int min = Integer.MAX_VALUE;
for (int i = -1; i <= 1; i++) {
for (int j = -1; j <= 1; j++) {
arr = input.clone();
cnt = 0;
if (i != 0)
cnt++;
if (j != 0)
cnt++;
arr[0] += i;
arr[1] += j;
int gap = arr[1] - arr[0];
if (check(gap))
min = Math.min(min, cnt);
}
}
bw.write((min == Integer.MAX_VALUE ? -1 : min) + "\n");
bw.flush();
}
private static boolean check(int gap) {
for (int i = 2; i < n; i++) {
int curGap = arr[i] - arr[i - 1];
boolean flag = false;
for (int j = -1; j <= 1; j++) {
if (curGap + j == gap) {
if (j != 0)
cnt++;
arr[i] += j;
flag = true;
break;
}
}
if (!flag)
return false;
}
return true;
}
}