snowball
[Python] 백준 1111번 : IQ Test 본문
🧠 백준 1111번 IQ Test: 단순한 패턴 찾기? 🤯 숨겨진 함정과 수학적 사고!
해당 글은 백준사이트의 1111번 문제를 풀고 배운 내용을 정리한 글입니다.
문제 url: https://www.acmicpc.net/problem/1111
오늘은 백준 1111번 "IQ Test" 문제를 풀면서 겪었던 경험과 풀이 과정을 공유하고자 합니다. 🤔 이 문제는 단순한 패턴 찾기처럼 보이지만, 몇 가지 예외 케이스와 숨겨진 수학적 규칙을 찾아야 하는 챌린지였습니다.
1️⃣ 접근 방식: 예외 처리 🧙♂️와 초기 아이디어💡
문제 소개 및 요약:
"IQ Test" 문제는 주어진 수열의 다음 수를 예측하는 것입니다. 🎯 간단한 패턴 찾기 문제이지만, 몇 가지 예외 케이스와 숨겨진 수학적 규칙 때문에 생각보다 까다로웠습니다. 😥
예외 케이스 파악:
문제를 보자마자 N=1과 N=2인 경우를 먼저 생각했습니다. 이 두 경우는 문제의 일반적인 규칙에서 벗어나기 때문에 예외 처리가 필요합니다.
N = int(input())
lst = list(map(int, input().split()))
if N == 1:
print('A')
elif N == 2:
if lst[0] == lst[1]:
print(lst[0])
else:
print('A')
이 코드는 N=1일 때는 다음 수를 예측할 수 없으므로 "A"를 출력하고, N=2일 때는 두 수가 같으면 두 번째 수를, 다르면 예측할 수 없으므로 "A"를 출력합니다. 여기까지는 괜찮은 접근 방식이라고 생각합니다.
2️⃣ 수학적 규칙 발견 🔎
패턴 식별:
N이 3 이상인 경우, 수열의 패턴을 파악하기 위해 세 개의 수를 분석했습니다.
A = lst[0]
B = lst[1]
C = lst[2]
이렇게 두고 한참을 고민 끝에 다음과 같은 관계식을 발견했습니다.
B = A * a + b
C = B * a + b
b = B - A * a
C = B * a + B - A * a
C = (B - A)a + B
C - B = (B - A) * a
이 수식을 통해 a와 b를 구하고, 다음 수를 예측할 수 있습니다.
3️⃣ 문제 풀이 과정 💻
완성된 코드 설명:
N = int(input())
lst = list(map(int, input().split()))
# N = 1 or N = 2 예외처리
if N == 1:
print('A')
elif N == 2:
if lst[0] == lst[1]:
print(lst[0])
else:
print('A')
# N = 3이상인 경우 패턴 파악
else:
A = lst[0]
B = lst[1]
C = lst[2]
X = B - A
Y = C - B
# Y/X의 zerodivine 방지 & 같은 값인 경우 처리
if X == 0:
for i in range(2,N):
if lst[i] - lst[i-1] != lst[i-1] - lst[i-2]:
print('B')
exit()
print(lst[-1] + lst[-1] - lst[-2])
else:
a = Y / X
b = B - (A*a)
# a값이 정수가 아닌 경우 예외처리
if a != int(a):
print('B')
else:
a = int(a)
b = int(b)
# 수열에 패턴이 적용되는지 확인
for i in range(1, N):
if lst[i] == lst[i-1] * a + b:
pass
# 통과 못하면 'B'
else:
print('B')
exit()
# 통과시,
print(lst[-1] * a + b)
각 단계별 처리 방법 상세 설명:
- N=1 또는 N=2인 경우를 먼저 처리합니다. ➡️
- 세 개의 수를 통해 패턴을 파악합니다. 🧐
- X == 0 인 경우를 처리합니다. ➗
- a 와 b 를 구하고 정수인지 판별합니다. 🔢
- 수열의 모든 수가 a와 b로 계산된 규칙을 따르는지 확인하고, 그렇지 않다면 "B"를 출력합니다. 🕵️♀️
- 그렇지 않으면 다음 수를 계산하여 출력합니다. 📤
4️⃣ 개선 여지 탐색 🤔
코드의 가독성 측면에서의 개선점:
변수명을 더 명확하게 사용하여 코드의 가독성을 높일 수 있습니다.
예외 처리 방식의 견고성 향상:
X = 0 인경우 모든 값이 같은지 확인하는 로직은 정확하지 않을 수 있어 수정할 예정입니다.
다른 접근 방식 고려 (가능하다면):
이 문제는 선형 관계식을 찾는 것이 핵심이지만, 다른 수학적 접근 방식을 통해 문제를 해결할 수도 있습니다.
5️⃣ 마무리 및 배운 점 🎓
이 문제를 통해 배운 알고리즘적 사고 방식:
이 문제를 통해 단순한 패턴 찾기 문제도 수학적 분석을 통해 해결할 수 있다는 것을 배웠습니다. 또한, 예외 케이스를 꼼꼼하게 처리하는 중요성을 깨달았습니다.
비슷한 패턴을 가진 다른 문제들에 대한 언급:
수학적 규칙을 찾아야 하는 다른 문제들에도 이 문제에서 얻은 경험을 적용할 수 있을 것입니다.
문제의 난이도에 겁먹지 말고 도전하는 것의 중요성:
문제를 처음 봤을 때 난이도가 높다고 생각해서 겁먹었지만, 차근차근 접근하고 고민한 결과 문제를 해결할 수 있었습니다. 이 경험을 통해 문제의 난이도에 겁먹지 않고 도전하는 것이 중요하다는 것을 깨달았습니다.
'알고리즘' 카테고리의 다른 글
[Python] 백준 1927번 : 최소 힙 (0) | 2025.03.24 |
---|---|
[Python] 백준 1487번 : 물건 팔기 (0) | 2025.03.20 |
[Python] 백준 20502번 : Gum색 (0) | 2025.03.16 |