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/미적분 배우던 때로 돌아가고 싶다..
'코딩테스트' 카테고리의 다른 글
[백준] 2212번 '센서' - Java (4) | 2024.09.06 |
---|---|
[백준] 1052번 '물병' - Java (0) | 2024.08.27 |
[프로그래머스] Lv1. 이웃한 칸 - Java (0) | 2024.08.24 |
[백준] 1325번 '효율적인 해킹' - Java (0) | 2024.08.22 |
[백준] 1105번 '팔' - Java (0) | 2024.08.21 |