CodeWars 15 : Tribonacci Sequence

김기욱·2021년 7월 1일
0

코딩테스트

목록 보기
54/68

문제설명

Well met with Fibonacci bigger brother, AKA Tribonacci.
피보나치의 형을 아시나요? 그 이름은 트라이보나치입니다.
As the name may already reveal, it works basically like a Fibonacci, but summing the last 3 (instead of 2) numbers of the sequence to generate the next.
이름을 보면 알 수 있죠? 피보나치와 거의 비슷하지만 앞에 두 개의 숫자를 더 한 값이 나열되는 피보나치수열과 달리 트라이보나치는 앞에 세 개의 숫자를 더 한 값이 연속적으로 나열되는 수열입니다.
So, if we are to start our Tribonacci sequence with [1, 1, 1] as a starting input (AKA signature), we have this sequence:
자 그럼 [1, 1, 1]로 시작하는 트라이보나치 수열을 한 번 보겠습니다. 이제부터 처음으로 주어지는 세 개의 숫자 배열을 signature라고 합시다.

[1, 1 ,1, 3, 5, 9, 17, 31, ...]

But what if we started with [0, 0, 1] as a signature? As starting with [0, 1] instead of [1, 1] basically shifts the common Fibonacci sequence by once place, you may be tempted to think that we would get the same sequence shifted by 2 places, but that is not the case and we would get:
그렇다면 [0, 0, 1]이 signature로 주어진다면 어떨까요? 아마 일반적인 피보나치수열과 비슷해서 헷갈리실수도 있는데, 그러면 안됩니다. 오늘 배운것은 앞에 두 개가 아니라 세 개의 숫자를 트라이보나치입니다. 예시를 볼까요.

[0, 0, 1, 1, 2, 4, 7, 13, 24, ...]

Well, you may have guessed it by now, but to be clear: you need to create a fibonacci function that given a signature array/list, returns the first n elements - signature included of the so seeded sequence.
이쯤되면 여러분들이 무엇을 하셔야 될지 제대로 파악하셨을겁니다. signature로 주어진 숫자들을 포함해 n의 길이만큼 나열되는 트라이보나치를 return하는 함수를 만들어보세요.

제한사항

Signature will always contain 3 numbers; n will always be a non-negative number; if n == 0, then return an empty array

Signature는 항상 세 개의 숫자로 이뤄져있습니다. n은 양수가 주어집니다. 만약 n이 0이라면 빈 배열을 return시켜줘야 합니다.

입출력 예시

[12, 10, 8, 12, 7, 6, 4, 10, 12]              -->  12
[12, 10, 8, 12, 7, 6, 4, 10, 12, 10]          -->  12
[12, 10, 8, 8, 3, 3, 3, 3, 2, 4, 10, 12, 10]  -->   3

풀이

def tribonacci(signature, n):
    if n <= 3:
        return signature[0:n]
    else:
        a, b, c = signature[0], signature[1], signature[2]
        for i in range(n-3):
            a, b, c = b, c, a + b + c
            signature.append(c)
    return signature

프로그래머스에서 비슷한문제를 푼 경험이 있어서, 그때 봐뒀던 다중대입법을 활용해보았습니다. 처음으로 주어지는 리스트인 signature의 길이인 3보다 작은 n이 파라미터로 들어온다면 이런 연산법을 사용할 필요없이 슬라이싱을 활용해 잘라서 내보내주면 됩니다.

3보다 크면 다중대입법을 사용해서 sigature에 하나씩 추가(append)해줍니다.
a, b, c = b, c, a+b+c 라는 다중대입법을 사용한다면 자동으로 할당과 동시에 트라이보나치를 완성시킬 수 있습니다. range(반복횟수)같은 경우 처음에 요소 3개가 담긴 리스트 signature가 주어지므로 3을 빼주면 됩니다.

다른풀이

def tribonacci(signature, n):
  res = signature[:n]
  for i in range(n - 3): 
  	res.append(sum(res[-3:]))
  return res

다중대입법 안쓰고도 슬라이싱만 써서 풀어낸 해답입니다.
이 풀이를 통해 배운게 좀 있네요.

첫 번째. 슬라이싱은 주어진 배열 길이보다 크게 자르면 알아서 최대길이로 자릅니다.
예를 들어 [1,2,3][:10]은 에러가 나지않고 [1,2,3]이 리턴됩니다.

두 번째. for loop와 range를 같이 사용할 경우 음수인 경우 에러가 발생하지않고 for loop이 실행되지 않습니다.

두 가지 특성을 활용하면 앞으로 코드작성시 더욱 간결하게 작성이 가능하겠네요. 🤩

profile
어려운 것은 없다, 다만 아직 익숙치않을뿐이다.

0개의 댓글