[백준]#1111 IQ Test
문제
IQ Test의 문제 중에는 공통된 패턴을 찾는 문제가 있다. 수열이 주어졌을 때, 다음 수를 찾는 문제이다.
예를 들어, 1, 2, 3, 4, 5가 주어졌다. 다음 수는 무엇인가? 당연히 답은 6이다. 약간 더 어려운 문제를 보면, 3, 6, 12, 24, 48이 주어졌을 때, 다음 수는 무엇인가? 역시 답은 96이다.
이제 제일 어려운 문제를 보자.
1, 4, 13, 40이 주어졌을 때, 다음 수는 무엇일까? 답은 121이다. 그 이유는 항상 다음 수는 앞 수*3+1이기 때문이다.
은진이는 위의 3문제를 모두 풀지 못했으므로, 자동으로 풀어주는 프로그램을 작성하기로 했다. 항상 모든 답은 구하는 규칙은 앞 수*a + b이다. 그리고, a와 b는 정수이다.
수 N개가 주어졌을 때, 규칙에 맞는 다음 수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 N이 주어진다. N은 50보다 작거나 같은 자연수이다. 둘째 줄에는 N개의 수가 주어진다. 이 수는 모두 절댓값이 100보다 작거나 같은 정수이다.
출력
다음 수를 출력한다. 만약 다음 수가 여러 개일 경우에는 A를 출력하고, 다음 수를 구할 수 없는 경우에는 B를 출력한다.
예제 입력 1
4
1 4 13 40
예제 출력 1
121
풀이
이 문제는 dfs(깊이 우선 탐색) 알고리즘을 이용해서 모든 경우의 수를 다 생각해서 풀 수 있었다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.HashSet;
public class Main {
static int[] arr;
static int N;
static HashSet<Integer> ans = new HashSet<>(); //가능한 다음 수 set
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
arr = new int[N];
String[] input = br.readLine().split(" ");
for(int i=0; i<N; i++)
arr[i] = Integer.parseInt(input[i]);
if(N==1) //하나의 수만 주어지면 다음에 올 수는 무조건 2개 이상
System.out.println("A");
else if(N==2) { //두 수가 주어졌을 때
if(arr[0]==arr[1]) //두 수가 같으면 다음 수는 무조건 둘과 같은 수
System.out.println(arr[0]);
else //두 수가 다르면 다음 수는 무조건 2개 이상
System.out.println("A");
}
else {
dfs(0, 0, 0);
if(ans.size()==0) //다음에 올 수가 없으면 B
System.out.println("B");
else if(ans.size()==1) {
for(int res : ans)
System.out.println(res);
}
else //다음에 올 수가 둘 이상이면 A
System.out.println("A");
}
}
public static void dfs(int idx, int a, int b) {
if(idx==N-2) {
boolean flag = true;
for(int i=0; i<N-1; i++) { //마지막에 도달 했을 때 전체 배열에서 만족하는 a,b인지 체크
if(arr[i]*a + b==arr[i+1]) continue;
flag = false;
}
if(flag)
ans.add(arr[N-1]*a + b);
return;
}
int pre = arr[idx];
int temp = arr[idx+1];
int next = arr[idx+2];
if(temp-pre==0) { //temp-pre==0 이면 나눌 수 없으므로 a를 0으로
dfs(idx+1, 0, temp);
}
else {
int x = (next-temp)/(temp-pre); //공비
int y = temp-pre*x; //공차
if(next==temp*x+y) {
dfs(idx+1, x, y);
}
}
}
}
Author And Source
이 문제에 관하여([백준]#1111 IQ Test), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@pss407/백준1111-IQ-Test저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)