반응형

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

 

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, -1, 0을 더해주는 세 가지 연산이 가능하므로 3 * 3 = 9가지의 경우가 나오게 됩니다.

각각의 경우의 공차와 두 번째 항의 초깃값을 이용해서, 남은 수들에 연산을 수행했을 때 등차수열을 만들 수 있는지 확인해줍니다.

 

#include <iostream>
#include <algorithm>
#define INF 2147483647
using namespace std;

int n, b[100000], ans = INF;

void dfs(int val, int idx, int cnt, int r) { // 이전에 선택한 값, 인덱스, 연산 횟수, 공차
	if (cnt >= ans) return;
	if (idx >= n) {
		ans = min(cnt, ans);
		return;
	}
	if(b[idx] - val == r) dfs(b[idx], idx + 1, cnt, r);
	if(b[idx] - 1 - val == r) dfs(b[idx] - 1, idx + 1, cnt + 1, r);
	if(b[idx] + 1 - val == r) dfs(b[idx] + 1, idx + 1, cnt + 1, r);
}

int main() {
	scanf("%d", &n);
	for (int i = 0; i < n; i++) scanf("%d", &b[i]);
	for (int i = -1; i < 2; i++)
		for (int j = -1; j < 2; j++)
			dfs(b[1] + i, 2, (i != 0) + (j != 0), (b[1] + i) - (b[0] + j));
	printf("%d", ans != INF ? ans : -1);
}
반응형

'Algorithm' 카테고리의 다른 글

백준 12904 : A와 B  (0) 2021.11.16
백준 16197 : 두 동전  (0) 2021.11.16
백준 6588 : 골드바흐의 추측  (0) 2021.11.16
백준 16946 : 벽 부수고 이동하기 4  (0) 2021.11.16
백준 16933 : 벽 부수고 이동하기 3  (0) 2021.11.16

+ Recent posts