ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [λ°±μ€€] 1788 ν”Όλ³΄λ‚˜μΉ˜μˆ˜μ˜ ν™•μž₯ with Python
    PS 2022. 3. 6. 21:35
    728x90
    λ°˜μ‘ν˜•

    πŸ“Œ BOJ 1788 ν”Όλ³΄λ‚˜μΉ˜μˆ˜μ˜ ν™•μž₯

    πŸ’‘ 쑰건

    1. ν”Όλ³΄λ‚˜μΉ˜ 수 F(n)을 n이 음수인 κ²½μš°λ‘œλ„ ν™•μž₯μ‹œν‚¬ 수 μžˆλ‹€.

    2. F(n) = F(n-1) + F(n-2)λ₯Ό n ≀ 1일 λ•Œλ„ μ„±λ¦½λ˜λ„λ‘ μ •μ˜ν•˜λŠ” 것이닀.

    3. n = 1일 λ•Œ F(1) = F(0) + F(-1)이 μ„±λ¦½λ˜μ–΄μ•Ό ν•˜λ―€λ‘œ, F(-1)은 1이 λ˜μ–΄μ•Ό ν•œλ‹€.

    4. n이 μ£Όμ–΄μ‘Œμ„ λ•Œ, ν”Όλ³΄λ‚˜μΉ˜ 수 F(n)을 κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜λŠ” ν”„λ‘œκ·Έλž¨.
      n은 음수둜 μ£Όμ–΄μ§ˆ μˆ˜λ„ μžˆλ‹€.

    5. n은 μ ˆλŒ“κ°’μ΄ 1,000,000을 λ„˜μ§€ μ•ŠλŠ” μ •μˆ˜μ΄λ‹€.
      첫째 쀄에 F(n)이 μ–‘μˆ˜μ΄λ©΄ 1, 0이면 0, 음수이면 -1을 좜λ ₯ν•œλ‹€.
      λ‘˜μ§Έ μ€„μ—λŠ” F(n)의 μ ˆλŒ“κ°’μ„ 좜λ ₯ν•œλ‹€.
      이 μˆ˜κ°€ μΆ©λΆ„νžˆ 컀질 수 μžˆμœΌλ―€λ‘œ, μ ˆλŒ“κ°’μ„ 1,000,000,000으둜 λ‚˜λˆˆ λ‚˜λ¨Έμ§€λ₯Ό 좜λ ₯ν•œλ‹€.

    6. λ‹€μ΄λ‚˜λ―Ήν”„λ‘œκ·Έλž˜λ° μœ ν˜•μ˜ 문제

    πŸ–₯ μ†ŒμŠ€ μ½”λ“œ

    from sys import stdin
    
    fibo = [0 for _ in range(1500000)]
    n = int(stdin.readline())
    fibo[0:1] = [0, 1]
    
    if n < 0:
        for i in range(-1, n - 1, -1):
            data = fibo[i+2] - fibo[i+1]
            if data < 0:
                fibo[i] = (abs(data) % 1000000000) * -1
            else:
                fibo[i] = data % 1000000000
        if fibo[n] < 0:
            print(-1)
            print(fibo[n] * -1)
        else:
            print(1)
            print(fibo[n])
    
    
    elif n > 0:
        for i in range(2, n + 1):
            fibo[i] = (fibo[i - 1] + fibo[i - 2]) % 1000000000
    
        print(1)
        print(fibo[n])
    
    else:
        print(0)
        print(0)

    πŸ”– 예제 및 μ‹€ν–‰κ²°κ³Ό

    예제

    10

    μ‹€ν–‰κ²°κ³Ό

    1
    55

    ⌨️ 문제 풀이

    1. ν”Όλ³΄λ‚˜μΉ˜ 값을 μ €μž₯ν•  fibo 리슀트 크기λ₯Ό 150만 개둜 λ§Œλ“€μ–΄μ€€λ‹€.
      리슀트의 첫번째 κ°’κ³Ό λ‘λ²ˆμ§Έ 값을 0 κ³Ό 1둜 μ €μž₯ν•œλ‹€.

    2. n 이 0보닀 μž‘μ€ 경우, -1λΆ€ν„° nκΉŒμ§€ -1μ”© μ€„μ—¬κ°€λ©΄μ„œ μˆœνšŒν•œλ‹€.
      fibo[i + 2] - fibo[i + 1] 의 점화식을 ν†΅ν•œ 값이 0 보닀 μž‘μ„ 경우
      fibo[i]의 값은 fibo[i + 2] - fibo[i + 1] λ₯Ό μ ˆλŒ€κ°’ μ²˜λ¦¬ν•΄ μ€€ ν›„, 1000000000둜 λ‚˜λˆ„κ³  λ‹€μ‹œ 음수둜 λ§Œλ“€μ–΄μ€€λ‹€.

    3. fibo[n] < 0 일 경우, -1 을 좜λ ₯ν•˜κ³ , fibo[n]λ₯Ό 음수둜 λ³€ν™˜ν•˜μ—¬ 좜λ ₯ν•œλ‹€.

    4. fibo[n] >= 0 일 경우, 1 을 좜λ ₯ν•˜κ³ , fibo[n]을 좜λ ₯ν•œλ‹€.

    5. n > 0 경우, 일반 ν”Όλ³΄λ‚˜μΉ˜μ²˜λŸΌ 수λ₯Ό κ΅¬ν•œλ‹€.

    6. n = 0 경우, 0을 좜λ ₯ν•œλ‹€.

    πŸ’Ύ λŠλ‚€μ 

    1. 음수둜 ν”Όλ³΄λ‚˜μΉ˜λ₯Ό ν™•μž₯ν•˜λŠ” 것이 생각보닀 쑰금 κΉŒλ‹€λ‘œμš΄ λŠλ‚Œμ΄ μžˆμ—ˆμŠ΅λ‹ˆλ‹€.
    λ°˜μ‘ν˜•

    λŒ“κΈ€

Designed by Tistory.