https://www.acmicpc.net/problem/1111
내 아이큐를 테스트하는 것 같은 문제..
arr[i+1] - arr[i]를 arr[i] - arr[i-1] 로 나누면 a를 구할 수 있다. 점화식을 세워보면 금방 알 수 있당
a를 구하면 b를 구하는 건 껌이다.
A를 출력해야하는 상황과 B를 출력해야하는 상황을 잘 구별하는 게 이 문제의 핵심이다.
둘 모두 "주어진 배열의 다음 숫자"에 대한 것임을 명심하자!
만약 배열의 크기가 1이라면 그 다음에 어떤 숫자든 올 수 있다. --> A
예를 들어서 [3] << 이렇게 덩그러니 있으면 그 다음에 뭐가 오든 규칙위배가 아니다.
배열의 크기가 2이고 arr[0]과 arr[1]이 같다면 그 다음에는 반드시 같은 숫자가 와야한다 --> 그 숫자 출력
arr[0]과 arr[1]이 다르다면 그 다음에 어떤 숫자든 올 수 있다. --> A
정해진 규칙에서 벗어난 숫자를 포함한 Arr라면 B를 출력한다.
여러 가지 경우를 생각하다보니 잘 풀려서 기분이 좋다!
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int[] arr = new int[n];
st = new StringTokenizer(br.readLine());
for (int i = 0; i < n; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
if (n == 1 || (n == 2 && arr[0] != arr[1])) {
bw.write("A");
} else if (n == 2) {
bw.write(arr[0] + "");
} else {
int a, b;
if (arr[1] == arr[0]) {
a = 1;
b = 0;
} else {
a = (arr[2] - arr[1]) / (arr[1] - arr[0]);
b = arr[1] - (arr[0] * a);
}
// validate
int i = 1;
for (; i < n; i++) {
if (arr[i] != (arr[i - 1] * a + b))
break;
}
if (i != n) {
bw.write("B");
} else {
bw.write((arr[n - 1] * a + b) + "");
}
}
bw.flush();
}
}
'알고리즘 > 백준' 카테고리의 다른 글
백준 1219 오민식의 고민(Java) (0) | 2020.10.03 |
---|---|
백준 9661 : 돌 게임 7 (0) | 2020.10.02 |
백준 16946 벽 부수고 이동하기4(JAVA) (0) | 2020.09.30 |
백준 14867 물통(JAVA) (0) | 2020.09.22 |
백준 1377 버블 소트 (0) | 2020.09.21 |