문제 원문: https://www.acmicpc.net/problem/1003

 

1003번: 피보나치 함수

각 테스트 케이스마다 0이 출력되는 횟수와 1이 출력되는 횟수를 공백으로 구분해서 출력한다.

www.acmicpc.net

 

관련 개념: 피보나치 수열과 재귀 (수학 기초내용이라 접음, 수학적으로 잘 모르겠으면 보세요)

더보기

수열이란 수의 나열로 이해하면 좋다. (고교 수학 과정에 포함)

수학적으로, 피보나치 수열은 a₀ = 0, a₁ = 1의 초기값을 가지고 앞의 두 수를 더하여 뒤의 수를 구하는 수열이다. 그러니까 a₂ = 1이고, a₃ = a  + a₁ = 2이다.

이를 일반화하여 점화식으로 쓰면 a = aₙ₋₁ + aₙ₋₂로 표현할 수 있다.

 

이 점화식을 재귀기법을 활용하여 코드로 표현하면 문제 원문의 함수처럼 된다. 점화식을 그대로 코딩한 것이기 때문에 사람이 이해하기는 쉬우나 숫자가 커질수록 계산횟수가 기하급수적으로 커진다. 일반적으로 43 이상의 숫자는 연산 결과를 보기 어렵다.

 

제출 답안: http://boj.kr/e9d51a6ca6ff4f969254b1a92353c34c

l = [None] * 41
def fibo(n):
    if n == 0:
        l[0] = [1, 0]
    if n == 1:
        l[1] = [0, 1]
    if l[n] == None:
        l[n] = [fibo(n-1)[0] + fibo(n-2)[0], fibo(n-1)[1] + fibo(n-2)[1]] 
    return l[n]

t = int(input())
for i in range(t):
    a = fibo(int(input()))
    print(a[0], a[1])

 

해설:

재귀 방식 피보나치 함수에서 fibonacci(0)과 fibonacci(1)이 몇 번 출력되는지 구하는 문제이다.

 

사용되는 피보나치 함수 코드를 주므로 재귀에 대한 개념이 있다면 문제 이해가 어렵지 않다.

다만 입력 숫자의 범위는 40 이하이나 제한시간이 0.25초이기 때문에 메모이제이션 기법을 사용하지 않으면 시간초과가 뜬다. 그래서 문제 분류가 다이내믹 프로그래밍으로 되어있다.

 

메모이제이션(memoization)이란, 메모리에 저장한다는 뜻으로 컴퓨터가 동일한 연산을 많이 반복할 경우 동일 연산의 결과값을 저장해두고 활용하는 것을 말한다. 빈 배열을 미리 선언해두고 계산할 때 해당하는 값이 있는지 체크해서 없을 때만 새로 저장하면 된다.

 

 

 

 

 

 

'알고리즘 문제풀이' 카테고리의 다른 글

[파이썬] 백준 2941: 크로아티아 알파벳  (0) 2023.07.26
머릿말  (0) 2022.12.07

문제 원문: https://www.acmicpc.net/problem/2941

 

2941번: 크로아티아 알파벳

예전에는 운영체제에서 크로아티아 알파벳을 입력할 수가 없었다. 따라서, 다음과 같이 크로아티아 알파벳을 변경해서 입력했다. 크로아티아 알파벳 변경 č c= ć c- dž dz= đ d- lj lj nj nj š s= ž z=

www.acmicpc.net

 

크로아티아 알파벳의 개수를 새는 문제다. 푸는 방법은 여러 가지가 있을 것으로 생각된다.

 

고려해야할 문자는 다음과 같다.

크로아티아 알파벳 변경
č c=
ć c-
dz=
đ d-
lj lj
nj nj
š s=
ž z=

 

 

제출 답안: http://boj.kr/8d45aab67c1345fa961657304e168d09
s = input()
a = len(s) - s.count('-') - s.count('=') - s.count('lj') - s.count('nj') - s.count('dz=')
print(a)

 

해설:

문자열 처리에 대해 연습할 수 있는 문제다.

여러 문자로 표현되는 알파벳들을 한 글자로 계산하여 글자수를 세어야 한다.

 

이론적으로는 표에 해당하는 알파벳을 모두 세어서 빼주면 될 거 같지만, 표현 상으로 dz= 안에 z=가 포함되기 때문에 이를 고려하여 문자열을 처리하여야 한다.

 

이 문자들은 몇 가지 규칙이 있다.

1. '=' 혹은 '-'를 사용 (lj, nj 제외)

2. dz=를 제외하면 2글자 표기

 

특정 문자들은 '=' 혹은 '-'를 포함하기 때문에 '='와 '-'를 세어서 글자수에서 뺄셈하여 모두 처리하였다. 이후 남는 알파벳은 lj, nj, dz=(혼자 3문자를 사용하기 때문에 한번 더 체크)다. 각각을 count() 함수로 세어 뺄셈하였다. 출력하면 끝.

 

 

첨언: 

replace() 함수를 이용할 수도 있으나 이때는 dz=와 z= 중 dz=를 꼭 먼저 처리해야한다. count() 함수를 이용한 이유는 처리 순서에 구애받지 않기 때문이었다. 

 

 

풀이 날짜: 20220312

'알고리즘 문제풀이' 카테고리의 다른 글

[파이썬] 백준 1003: 피보나치 함수  (0) 2023.08.04
머릿말  (0) 2022.12.07

 

백준 문제 풀었던 거 올립니다. 그게 다 끝나면 프로그래머스나 leetcode도 올립니다.

 

개인적으로 했던 문제설명이나 스스로 만들었던 자료들을 버리기 아까워서 정리해봅니다.

직접 코딩하거나 핸드아웃 제작했던 자료들만 공개하며, 다른 루트로 제공받은 자료는 공개하지 않으므로 비밀유지 등에 어긋나지 않습니다.

 

이 탭은 기초 단계, 초등생도 이해할 수 있는 코딩을 목표로 합니다. 

+ Recent posts