새소식

Career/Coding Test

99클럽 코테 스터디 21/99일차 TIL #피보나치 수(미들러)

  • -
반응형

 

 

def solution(n):
    
    _curr, _next = 0, 1
    for _ in range(n):
        _curr, _next = _next, _curr + _next
        
    answer = _curr % 1234567
    return answer

 

피보나치 수열 문제를 풀면서 이전에 생각없이 넘어갔다가 이번에 문제를 풀고 확인해야 하는 부분이 생겼다.

# 1)
_curr = _next
_next = _curr + _next

# 2)
_curr, _next = _next, _curr+_next

 

어차피 할당을 하는거니 한 줄로 안써도 되는거 아닌가? 하고 문제를 풀었지만 댕같이 실패.

값을 하나 하나 넣어봐야 확인이 가능했고 이를 chatgpt를 통해 확인해보았다.


코드에서 _curr, _next = _next, _curr + _next를 두 줄로 나누어 작성할 수 없는 이유는 **동시 할당 (simultaneous assignment)**의 특징 때문입니다. 이 특징이 어떻게 영향을 미치는지 설명하겠습니다.

동시 할당의 의미

파이썬에서 _curr, _next = _next, _curr + _next는 동시에 일어나는 연산입니다. 이는 두 변수에 대한 업데이트가 동시에 일어난다는 뜻입니다. 구체적으로는:

  • _curr은 기존 _next 값을 가져옵니다.
  • _next는 기존 _curr과 _next의 합을 계산하여 새 값을 할당합니다.

이 과정은 동시에 발생하기 때문에, _curr의 값이 업데이트되기 전에 _next의 계산이 이루어집니다.

순차 할당의 문제점

반면에, 이 코드를 두 줄로 나누어 작성하면 다음과 같이 됩니다:

python
코드 복사
_curr = _next _next = _curr + _next

이 경우 두 줄은 순차적으로 실행됩니다. 그러면 어떤 문제가 발생하는지 살펴봅시다.

  1. 첫 번째 줄:이 줄에서 _curr은 _next의 값을 가져옵니다. 이제 두 변수 모두 같은 값을 가지게 됩니다.
  2. python
    코드 복사
    _curr = _next
  3. 두 번째 줄:이제 _curr과 _next가 동일한 값을 가지기 때문에, 이 줄의 결과는 단순히 _next를 두 배로 만드는 셈입니다. 즉, 이 줄의 결과는 피보나치 수열을 계산하는 것과 전혀 다른 결과를 낳게 됩니다.
  4. python
    코드 복사
    _next = _curr + _next

예시로 확인

초기값으로 _curr = 0과 _next = 1을 사용한다고 가정해 보겠습니다.

  • 올바른 코드 (동시 할당):
    • 첫 번째 반복 후: _curr = 1, _next = 1
    • 두 번째 반복 후: _curr = 1, _next = 2
  • python
    코드 복사
    _curr, _next = _next, _curr + _next
  • 잘못된 코드 (순차 할당):
    • 첫 번째 반복 후: _curr = 1, _next = 2 (두 배가 됨)
    • 두 번째 반복 후: _curr = 2, _next = 4 (다시 두 배가 됨)
  • python
    코드 복사
    _curr = _next _next = _curr + _next

이 결과는 피보나치 수열이 아니라, 단순히 이전 값의 두 배를 계산하는 잘못된 수열을 만들어냅니다.

결론

결론적으로, _curr, _next = _next, _curr + _next를 두 줄로 나누어 작성할 수 없는 이유는 동시 할당의 특성 덕분에, 두 값이 서로 영향을 주지 않으면서 동시에 업데이트되기 때문입니다. 순차적으로 값을 할당하면 첫 번째 할당이 두 번째 할당에 영향을 미쳐 잘못된 결과를 낳게 됩니다.


반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.