[λ°±μ€€] 1111 IQ Test

eunbiΒ·2022λ…„ 8μ›” 16일
0
post-thumbnail

πŸ” 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κ°œκ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ, κ·œμΉ™μ— λ§žλŠ” λ‹€μŒ 수λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.


πŸ€” 풀이

  • 처음 풀이
    '음... bλŠ” λ‚˜μ—΄λœ 두 숫자의 차이λ₯Ό λ„˜μ§€ μ•Šμ„κ±°κ³ ..!(μ•„λ‹˜, aκ°€ 음수면 κ°€λŠ₯함) aλŠ” κ·Έ μ „μ˜ 숫자λ₯Ό κ³±ν•΄μ£ΌλŠ”κ±°λ‹ˆκΉŒ b보닀 μž‘κ² μ§€...(이것도 μ•„λ‹˜. bκ°€ μŒμˆ˜μΌμˆ˜λ„ 있음)' μ•„λ¬΄νŠΌ 이런 ν‹€λ¦° 생각을 κ°€μ§€κ³  λ‹€μŒκ³Ό 같이 ν’€μ—ˆλ‹€.
/* 1. 두 숫자λ₯Ό λ‚˜λˆˆλ‹€. λ‚˜λˆ μ„œ λ‚˜μ˜¨ λͺ« μ΄ν•˜λ‘œ aλ₯Ό κΈ°μ€€μœΌλ‘œ λ‹€ 돌렀보기.
	1-1. N2λ₯Ό N1둜 λ‚˜λˆˆλ‹€. => κ°’ : p.rr...
	1-2. κ°’ pλ₯Ό a둜 μ„Έμš΄λ‹€.
	1-2-1. N1에 aλ₯Ό κ³±ν•΄ N2의 μ°¨λ₯Ό 벑터에 μ €μž₯ν•œλ‹€.
	1-3. a = a-1; ν•΄μ„œ, -pκΉŒμ§€ ν•œλ‹€. <pκ°€ λ§ˆμ΄λ„ˆμŠ€μΌ λ•Œλ₯Ό κ³ λ €ν•˜μ§€ μ•ŠμŒ. μΆ”κ°€λ‘œ r도 λ§ˆμ΄λ„ˆμŠ€κ°€ 될 수 μžˆλ‹€...>

	2. λ‹€μŒ 두 숫자둜 λ„˜μ–΄κ°„λ‹€.
	2-1. λ²‘ν„°μ—μ„œ 숫자λ₯Ό κΊΌλ‚΄μ„œ κ·Έ 식이 μ„±λ¦½ν•˜λŠ”μ§€ ν™•μΈν•œλ‹€. μ•„λ‹ˆλ©΄ μ»·. λ§ˆμ§€λ§‰κΉŒμ§€ 반볡.

	3. 벑터에 남은값을 ν™•μΈν•œλ‹€. λ§Œμ•½μ— ν•˜λ‚˜λ§Œ λ‚¨μ•„μžˆμœΌλ©΄, λ‹€μŒ 수 계산 γ„±γ„΄ 좜λ ₯.
	λ§Œμ•½, μ—¬λŸ¬κ°œκ°€ λ‚¨μ•„μžˆμœΌλ©΄ Aλ₯Ό 좜λ ₯.
	ν•˜λ‚˜λ„ μ—†λ‹€λ©΄, Bλ₯Ό 좜λ ₯.
*/
  • (N이 3 미만일 λ•Œ)
    - μ£Όμ–΄μ§„ μˆ«μžκ°€ ν•˜λ‚˜λ°–μ— μ—†λ‹€λ©΄ κ·œμΉ™μ„ μ—¬λŸ¬κ°œ μ„ΈμšΈ 수 μžˆλ‹€. λ”°λΌμ„œ 닡이 μ—¬λŸ¬κ°œμž„μ„ 좜λ ₯ν•œλ‹€. \
    - μ£Όμ–΄μ§„ μˆ«μžκ°€ λ‘κ°œλΏμ΄λΌλ©΄, 두 κ°€μ§€ μΌ€μ΄μŠ€λ‘œ λ‚˜λˆŒ 수 μžˆλ‹€.
    1) λ§Œμ•½ 두 μˆ«μžκ°€ 같을 λ•ŒλŠ” aκ°€ 1이고, bκ°€ 0μ΄κ±°λ‚˜ aκ°€ 0이고 bκ°€ 숫자 μžμ²΄μ΄λ‹€. 두 경우 λͺ¨λ‘ ꡬ할 수 μžˆλŠ” λ‹€μŒ μˆ˜λŠ” κ°™μœΌλ―€λ‘œ, ν•΄λ‹Ή 수λ₯Ό 좜λ ₯ν•œλ‹€.
    2) λ§Œμ•½ 두 μˆ«μžκ°€ λ‹€λ₯Ό λ•ŒλŠ” 두 μˆ«μžλ§ŒμœΌλ‘œλŠ” ν•˜λ‚˜μ˜ κ·œμΉ™μ„ 찾을 수 μ—†λ‹€. λ”°λΌμ„œ 닡이 μ—¬λŸ¬κ°œμž„μ„ 좜λ ₯ν•œλ‹€.
  • (N이 3 이상일 λ•Œ)
    문제의 κ·œμΉ™μ„ 보면 {N2=N1Γ—a+bβ‹―(1)N3=N2Γ—a+bβ‹―(2)…\begin{cases} N_2 = N_1\times a + b \cdots(1) \\ N_3 = N_2\times a + b\cdots(2) \\ \dots \end{cases} 을 λ”°λ₯Έλ‹€λŠ” 것을 μ•Œ 수 μžˆλ‹€.
    - (1)번 식과 (2)번 식을 μ—°λ¦½ν•˜λ©΄ N3βˆ’N2=aΓ—(N2βˆ’N1)β‡’a=(N3βˆ’N2)/(N2βˆ’N1)N_3 - N_2 = a\times (N_2-N_1) \Rightarrow a = (N_3-N_2)/(N_2-N_1) 이 λ‚˜μ˜¨λ‹€. λ¬Έμ œμ—μ„œ aκ°€ μ •μˆ˜λΌκ³  ν•˜μ˜€μœΌλ―€λ‘œ, 두 식을 μ—°λ¦½ν•΄μ„œ κ΅¬ν•œ aκ°€ μ •μˆ˜κ°€ 아닐 κ²½μš°μ—λŠ” 닡을 ꡬ할 수 μ—†λ‹€. λ§Œμ•½ κ΅¬ν•œ aκ°€ μ •μˆ˜λΌλ©΄ b λ˜ν•œ ꡬ할 수 μžˆλ‹€. (μΆ”κ°€μ μœΌλ‘œ N2βˆ’N1N_2-N_1이 0μΌμΌμˆ˜λ„ μžˆλ‹€. zeroDivision을 λ°©μ§€ν•˜κΈ° μœ„ν•΄ μ΄λ•ŒλŠ” aκ°€ 0μΈκ²ƒμœΌλ‘œ κ³„μ‚°ν•œλ‹€)
    - N1,N2,N3N_1, N_2, N_3 을 μ—°λ¦½ν•΄μ„œ κ΅¬ν•œ a, b μ΄λ―€λ‘œ λ‹€λ₯Έ μˆ«μžμ—μ„œλŠ” μ μš©λ˜μ§€ μ•Šμ„ 수 μžˆλ‹€. λ”°λΌμ„œ μž…λ ₯받은 μˆ«μžλ“€μ„ κ΅¬ν•œ a, b둜 κ³„μ‚°ν•œ κ°’κ³Ό 같은지 λΉ„κ΅ν•˜μ—¬ λͺ¨λ‘ κ°™μœΌλ©΄ λ‹€μŒ 수λ₯Ό κ΅¬ν•˜μ—¬ 좜λ ₯ν•˜κ³ , λ‹€λ₯΄λ‹€λ©΄ ꡬ할 수 μ—†μŒμ„ 좜λ ₯ν•œλ‹€.

πŸ“ μ½”λ“œ

#include <iostream>
using namespace std;

int N;
int list[50];

int main() {
    /** INPUT **/
    cin >> N;
    for (int i = 0; i < N; i++) {
        cin >> list[i];
    }
    /** SOLUTION **/
    int a, b;
    if (N <= 2) {
        if (N == 1) {
            // 값이 μ—¬λŸ¬κ°œμž„. A
            cout << 'A';
        }
        else {
            if (list[0] == list[1]) {
                // aκ°€ 1이고, bκ°€ 0인 것.
                cout << list[0];
            }
            else {
                // 값이 μ—¬λŸ¬κ°œμž„. A.
                cout << 'A';
            }
        }
        return 0;
    }
    else {
        int inter1 = list[1] - list[0];
        int inter2 = list[2] - list[1];
        if (inter1 == 0) {
            a = 0;
        }
        else {
            if (inter2 % inter1 != 0) {
                cout << 'B';
                return 0;
            }
            a = inter2 / inter1;
        }
        b = list[1] - a*list[0];
    }

    for (int idx = 1; idx < N; idx++) {
        if (list[idx] != list[idx-1]*a + b) {
            cout << 'B';
            return 0;
        }
    }

    cout << list[N-1]*a + b;
    return 0;
}

0개의 λŒ“κΈ€