본문 바로가기
코딩테스트

[백준] 1111번 'IQ TEST' - Java

by CuckooBird 2024. 8. 26.

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


문제


풀이 

조건은 이렇게 나뉩니다.

1. n =1 일 경우 → ans="A"

2. n = 2 일 경우

 - 두 수가 같을 경우 → 두 수가 0이라면 ans="0" (/zero 예외)  |  0이 아니라면 ans="arr[0]"

 - 두 수가 다를 경우 → ans = "A"

3. n >= 3 일 경우

 - a와 b의 규칙에 맞음 → ans = arr[n-1] * a + b

 - a와 b의 규칙에 맞지 않음 → ans = "B"

 

 

3번의 경우는 중학생 때 배웠던 일차방정식의 a와 b를 구하는 방식을 이용했습니다.

먼저 arr[0], arr[1], arr[2] 을 통해 a와 b를 구하고, a와 b가 모든 값에 동일하게 작용하는지 테스트 하여 맞지 않으면 B를, 맞다면 값을 반환하도록 합니다.

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
	
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int n = Integer.valueOf(br.readLine());
		
		int[] arr = new int[n];
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		for(int i=0; i<n; i++) {
			arr[i] = Integer.valueOf(st.nextToken());
		}
		
		String ans = solution(arr, n);
		System.out.print(ans);
	}
	
	public static String solution(int[] arr, int n) {
		if(n == 1) return "A";
		
		if(n == 2) {
			if(arr[0] == arr[1]) {
				if(arr[0]==0) return "0";
				else return String.valueOf(arr[0]);
			} else return "A";
		}
		
		int x1 = arr[0];
        int x2 = arr[1];
        int x3 = arr[2];

        int a = (x2 != x1) ? (x3 - x2) / (x2 - x1) : 0;
        int b = x2 - x1 * a;
		
		for(int i=1; i<n-1; i++) {
			int x = arr[i];
			int y = arr[i+1];
			if(x*a+b != y) return "B";
		}
		
		return String.valueOf(arr[n-1]*a+b);
	}
	
}

 

https://github.com/kwakminjung/BOJ/commit/0ed2e9264be5b016d85d1055be9200770740061d

 

✨feat: [골드3] IQ TEST 1111번 : 수학, 구현, 브루트포스 알고리즘, 많은 조건 분기 · kwakminjung/BOJ@0ed2e

백준 1111번 : IQ TEST (골드3) 알고리즘 분류 : 수학, 구현, 브루트포스 알고리즘, 많은 조건 분기 풀이 : https://cuckoobird.tistory.com/207 결과 : 맞았습니다 (메모리 14220KB | 시간 100ms)

github.com

 


회고

n == 2 일 경우에 arr[1]가 arr[0]의 두 배라면 답이 하나일 거라고 생각했는데, 12a+b=24 라고 생각했을 때에 a=1, b=12 인 경우와 a=0, b=24인 경우가 다를 거라는 생각을 못 했습니다. 2a+b=4를 예로 생각해서 몰랐는데, 반례를 생각할 때에는 작은 수부터 큰 수도 해봐야 겠습니다.

 

오랜만에 일차방정식 푸니까 행복하네요.. 수학1/수학2/미적분 배우던 때로 돌아가고 싶다..