강의로 돌아가기
yj20005237

문제의 지문이 명백하게 잘못됬음에도 조치가 없는 이유는 무엇인가요?

7번이후 부터는 통과할 수 없어서

질문란에 들어와보니

n번째 피보나치 수 % 1234567 을 Return하는 것이 아닌

n번째 수 = (n-1 번째 + n-2번째) % 1234567 로 해야 정답에 도달 할 수 있네요.

이미 다른 분들이 해당 안건에 대해서 여러번 지적했는데도 불구하고

변화가 없는 이유가 있을까요

2 개의 답변
이준희

일반적인 프로그래밍 언어는 CPU에서 제공하는 최소 읽기 단위(word라고 하는 것으로 기억합니다)를 기준으로 변수의 범위를 지정합니다. 일반적인 x86 시스템은 word의 크기가 4byte라고 가정하며, 그렇기 때문에 int라는 자료형은 -2,147,483,648 ~ 2,147,483,647까지의 값만을 표현할 수 있습니다(계산해보시면 총 숫자 개수가232 개입니다. 1 바이트는 8비트니까요)
그래서 프로그래밍을 하면 정수의 범위에 정말 신경을 쓰셔야 합니다. 예를 들어서 2,147,483,647을 저장하고 있는 int 변수에 1을 더하면 그 숫자는 2,147,483,648이 아닌, -2,147,483,648이 됩니다. 왜냐고요? 이는 2의 보수라는 개념으로 인해서 발생하는데, 자세한 것은 검색해보세요. 여튼간에 이를 줄이면, 각각의 변수는 사용할 수 있는 숫자의 범위가 있고, 이를 벗어나면 예상치 못한 이상한 결과를 내놓는다는 겁니다. 이는 질문자 님께서 지금 사용하시는 프로그래밍 언어는 1바이트 하나도 소중히 여겨서 프로그래밍 해야하는 시절에 설계됐으며, 그렇기에 프로그래머가 알아서 변수를 범위 내에 둘 만큼 현명하다고 상정하고 있기 때문입니다.
그런데 피보나치 수는 엄청나게 빠르게 증가합니다. 44번째 피보나치 수만 가도 2971215073로 int 범위를 넘어버립니다. 이대로면 피보나치의 수를 구하라는 문제는 int형으로는 풀 수 없는 문제겠죠? 그런데 우리에게는 고마운 성질이 있습니다. 숫자 A, B, C가 있다고 하면 (A + B) % C의 값은 ( ( A % C ) + ( B % C) ) % C와 같다는 성질입니다. 이 외에도 여러가지 있는데 알고 싶으시다면 모듈러 연산의 성질을 검색해보세요.
그래서 문제가 1234567로 나눈 나머지를 출력하라고 하는 겁니다. 조금만 숫자가 커져도 피보나치는 int로 표현할 수 있는 범위를 넘겨버리는데, 매번 1234567로 나눈 나머지만을 저장하는 것은 int의 범위에서 가뿐하니까요. 질문자님이 문제를 풀 수 없었던 이유는, n번째 피보나치 수라고 구한 숫자가, 이미 int의 범위를 넘긴 상태라 엉망진창이 된 상태일 것이고, 이것을 1234567로 나눈다고 한들 정확한 값을 구하는 것은 불가능했기 때문입니다. 지문이 명백히 잘못된 것이 아니라, 이미 잘못된 값의 나머지 값을 답으로 내놓으셨으니, 정답이 아니라고 한 것입니다.
혹시나 이것이 믿겨지지 않는다면 자체적으로 자료형 구분 없이 큰 수를 저장할 수 있는 Python등의 언어를 사용해서 질문자님이 앞서 구현하신 대로 구현해보세요. 전부 정답 처리 될 것입니다.

한줄요약: 문제에서 1234567로 나눈 나머지를 정답으로 내놓으라는 것은 문제를 꼰 것이 아니라 int 자료형의 범위 내에 항상 값이 있을 수 있도록 한 배려이며, 자료형의 크기에 제한이 있는 언어를 쓸 경우 (A + B) % C ≡ ( ( A % C ) + ( B % C) ) % C라는 성질을 이용해서 매번 계산 결과에 1234567으로 나눈 나머지를 대신 넣는 것으로 int 범위 내에 항상 값이 존재함을 보장할 수 있다.

  • Yong SangYoon

    지나가던 중 잘 읽었습니다 좋은 글 감사합니다!!! ㅜㅜㅜ

    Yong SangYoon―2021.05.11 18:47
  • 빈츠

    이해가 되었습니다 감사합니다..!

    빈츠―2021.06.26 19:35
  • jemizem

    덕분에 문제 이해가 됐습니다! 정성스런 글 감사합니다~

    jemizem―2021.08.23 18:50
  • 윤의현

    1234567을 왜 나눠야하는거 하고 질문부터 찾아보고 있었는데 이런뜻이 있었군요... 대부분 내가 모르는 일에는 역시 이유가 있는 법이네요

    윤의현―2021.11.01 22:50
  • Horyong Jung

    감사합니다

    Horyong Jung―2021.11.04 19:39
  • helirang

    배워갑니다.

    helirang―2022.08.02 13:29
  • 이정연

    1234567이 그런 의미가 있었군요... 아무생각없이 풀다가 막혔는데 덕분에 시야가 넓어졌습니다 감사합니다 :>

    이정연―2022.09.11 13:30
  • 이종훈

    선생님 제가 어떻게 센세로 모실수있는 방법이 있을까요 ??

    이종훈―2022.09.19 14:51
  • 이준희

    댓글이 많이 달렸네요😂 1. 프로그래밍 배우시는 분들이 많이 늘어서 기쁩니다. 2. 센세로 모시기에는 부족함이 많은 사람입니다... 그럼 이만~

    이준희―2022.11.24 20:16
  • Bruce Han

    맛있습니다... 잘 먹었습니다

    Bruce Han―2022.12.09 16:44
  • 이용준

    멋져요

    이용준―2023.07.21 23:03
  • marioahn

    와;;;;;;감사합니다

    marioahn―2023.09.06 04:31
  • name

    감사하ㅂ니다

    name―2024.03.21 17:37
aerocode

N으로 나눈 나머지를 반환하는 문제는 십중팔구 "int64도 버티지 못할만큼 숫자가 엄청 커지니까 적당히 나눠라"는 늬앙스입니다.
중간에 모듈러 연산을 안해주면 일찍이 오버플로우가 발생했을테니 오답이죠.

답변 쓰기
이 입력폼은 마크다운 문법을 지원합니다. 마크다운 가이드 를 참고하세요.