snowball

[Python] 백준 1111번 : IQ Test 본문

알고리즘

[Python] 백준 1111번 : IQ Test

작성자1 2025. 4. 2. 14:38

🧠 백준 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)

 

각 단계별 처리 방법 상세 설명:

  1. N=1 또는 N=2인 경우를 먼저 처리합니다. ➡️
  2. 세 개의 수를 통해 패턴을 파악합니다. 🧐
  3. X == 0 인 경우를 처리합니다. ➗
  4. a 와 b 를 구하고 정수인지 판별합니다. 🔢
  5. 수열의 모든 수가 a와 b로 계산된 규칙을 따르는지 확인하고, 그렇지 않다면 "B"를 출력합니다. 🕵️‍♀️
  6. 그렇지 않으면 다음 수를 계산하여 출력합니다. 📤

 

4️⃣ 개선 여지 탐색 🤔

코드의 가독성 측면에서의 개선점:

변수명을 더 명확하게 사용하여 코드의 가독성을 높일 수 있습니다.

 

예외 처리 방식의 견고성 향상:

X = 0 인경우 모든 값이 같은지 확인하는 로직은 정확하지 않을 수 있어 수정할 예정입니다.

 

다른 접근 방식 고려 (가능하다면):

이 문제는 선형 관계식을 찾는 것이 핵심이지만, 다른 수학적 접근 방식을 통해 문제를 해결할 수도 있습니다.

 

 

5️⃣ 마무리 및 배운 점 🎓

이 문제를 통해 배운 알고리즘적 사고 방식:

이 문제를 통해 단순한 패턴 찾기 문제도 수학적 분석을 통해 해결할 수 있다는 것을 배웠습니다. 또한, 예외 케이스를 꼼꼼하게 처리하는 중요성을 깨달았습니다.

 

비슷한 패턴을 가진 다른 문제들에 대한 언급:

수학적 규칙을 찾아야 하는 다른 문제들에도 이 문제에서 얻은 경험을 적용할 수 있을 것입니다.

 

문제의 난이도에 겁먹지 말고 도전하는 것의 중요성:

문제를 처음 봤을 때 난이도가 높다고 생각해서 겁먹었지만, 차근차근 접근하고 고민한 결과 문제를 해결할 수 있었습니다. 이 경험을 통해 문제의 난이도에 겁먹지 않고 도전하는 것이 중요하다는 것을 깨달았습니다.

'알고리즘' 카테고리의 다른 글

[Python] 백준 1927번 : 최소 힙  (0) 2025.03.24
[Python] 백준 1487번 : 물건 팔기  (0) 2025.03.20
[Python] 백준 20502번 : Gum색  (0) 2025.03.16