문제 링크입니다: 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]은 등차수열이 아니다. 수열 B = [B1, B2, ..., BN]을 등차수열로 변환하려고 한다. 각각의 수에는 연산을 최대 한 번 적용할 수 있다. 연산은 두 가
www.acmicpc.net
N의 크기가 최대 100,000이기 때문에 모든 경우의 수를 고려하는 코드를 작성할 경우 TLE가 발생할 것이 자명합니다.
따라서, 등차수열의 규칙을 생각해봐야 합니다.
수학에서, 등차수열은 연속하는 두 항의 차이가 모두 일정한 수열을 뜻합니다.
따라서, 등차수열이기 위해서는 (두 번째 숫자 - 첫 번째 숫자)의 차가 (세 번째 숫자 - 두 번째 숫자), (네 번째 숫자 - 세 번째 숫자), ..., (N 번째 숫자 - (N - 1) 번째 숫자)와 동일해야합니다.
즉, 두 번째 숫자와 첫 번째 숫자를 각각 독립적으로 [-1, 0, 1]한 결과를 토대로 등차수열을 유지할 수 있는지 연산해나가면 시간복잡도가 O(9 * N)이기 때문에 TLE 발생을 걱정하지 않아도 됩니다.
#include <iostream> | |
#include <vector> | |
#include <algorithm> | |
using namespace std; | |
int main(void) | |
{ | |
ios_base::sync_with_stdio(0); | |
cin.tie(0); | |
int N; | |
cin >> N; | |
if (N == 1) | |
{ | |
cout << 0 << "\n"; | |
return 0; | |
} | |
vector<int> v(N); | |
for (int i = 0; i < N; i++) | |
{ | |
cin >> v[i]; | |
} | |
int result = -1; | |
for (int add = -1; add <= 1; add++) | |
{ | |
for (int add2 = -1; add2 <= 1; add2++) | |
{ | |
int tempCnt = 0; | |
tempCnt = add ? tempCnt + 1 : tempCnt; | |
tempCnt = add2 ? tempCnt + 1 : tempCnt; | |
int diff = (v[1] + add2) - (v[0] + add); | |
bool isPossible = true; | |
int next = v[1] + add2; | |
for (int i = 2; i < N; i++) | |
{ | |
next += diff; | |
if (v[i] == next) | |
{ | |
continue; | |
} | |
if (v[i] + 1 == next || v[i] - 1 == next) | |
{ | |
tempCnt++; | |
continue; | |
} | |
isPossible = false; | |
break; | |
} | |
if (isPossible) | |
{ | |
if (result == -1) | |
{ | |
result = tempCnt; | |
continue; | |
} | |
result = min(result, tempCnt); | |
} | |
} | |
} | |
cout << result << "\n"; | |
return 0; | |
} |


개발환경:Visual Studio 2017
지적, 조언, 질문 환영입니다! 댓글 남겨주세요~
'알고리즘 > BOJ' 카테고리의 다른 글
백준 5568번 카드 놓기 (0) | 2020.04.21 |
---|---|
백준 17609번 회문 (0) | 2020.04.20 |
백준 2522번 별 찍기 - 12, 백준 2523번 별 찍기 - 13 (0) | 2020.04.10 |
백준 13015번 별 찍기 - 23 (0) | 2020.04.10 |
백준 10997번 별 찍기 - 22 (0) | 2020.04.09 |