[백준 15130] Arithmetic Sequences (C#, C++) - soo:bak
작성일 :
문제 링크
설명
길이 10의 등차수열에서 8개는 0으로 표시되고 2개는 양의 정수가 주어집니다. 등차수열을 정수로 완성할 수 있으면 전체 10항을, 불가능하면 -1을 출력하는 문제입니다.
접근법
먼저 주어진 두 위치와 값을 찾은 후, 두 값의 차이가 두 위치의 차이로 나누어떨어지는지 확인해 공차를 구합니다.
만약, 나누어떨어지지 않으면 불가능하므로 -1을 출력합니다.
나누어떨어진다면 첫 항을 계산하고 이를 이용해 모든 항을 생성합니다.
Code
C#
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
45
46
47
48
49
50
51
using System;
using System.Text;
class Program {
static void Main() {
var parts = Console.ReadLine()!.Split();
var arr = Array.ConvertAll(parts, int.Parse);
var idx1 = -1;
var idx2 = -1;
long val1 = 0, val2 = 0;
for (var i = 0; i < 10; i++) {
if (arr[i] != 0) {
if (idx1 == -1) {
idx1 = i;
val1 = arr[i];
}
else {
idx2 = i;
val2 = arr[i];
}
}
}
var diffNum = val2 - val1;
var diffDen = idx2 - idx1;
if (diffNum % diffDen != 0) {
Console.WriteLine(-1);
return;
}
var d = diffNum / diffDen;
var a0 = val1 - d * idx1;
var res = new long[10];
for (var i = 0; i < 10; i++)
res[i] = a0 + d * i;
if (res[idx1] != val1 || res[idx2] != val2) {
Console.WriteLine(-1);
return;
}
var sb = new StringBuilder();
for (var i = 0; i < 10; i++) {
if (i > 0)
sb.Append(' ');
sb.Append(res[i]);
}
Console.WriteLine(sb.ToString());
}
}
C++
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
45
46
47
48
49
50
51
52
53
54
55
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
ll arr[10];
for (int i = 0; i < 10; i++)
cin >> arr[i];
int idx1 = -1, idx2 = -1;
ll v1 = 0, v2 = 0;
for (int i = 0; i < 10; i++) {
if (arr[i] != 0) {
if (idx1 == -1) {
idx1 = i;
v1 = arr[i];
}
else {
idx2 = i;
v2 = arr[i];
}
}
}
ll num = v2 - v1;
int den = idx2 - idx1;
if (num % den != 0) {
cout << -1 << "\n";
return 0;
}
ll d = num / den;
ll a0 = v1 - d * idx1;
ll res[10];
for (int i = 0; i < 10; i++)
res[i] = a0 + d * i;
if (res[idx1] != v1 || res[idx2] != v2) {
cout << -1 << "\n";
return 0;
}
for (int i = 0; i < 10; i++) {
if (i)
cout << ' ';
cout << res[i];
}
cout << "\n";
return 0;
}