본문 바로가기
알고리즘 설명

파이썬 음수의 나머지 연산

by 다빈치코딩 2024. 3. 11.

목차

    반응형

    나머지 연산은 프로그래밍에서 정말 많이 사용하는 연산자 입니다. 나머지 연산자(%)에 대해서 아직 잘 모른다면 아래 링크를 통해 확인 바랍니다.

    https://wikidocs.net/214915

     

    08. 나머지 연산

    [TOC] 실생활에서는 잘 사용하지 않지만 프로그래밍에서 많이 사용하는 연산중 하나가 나머지 연산 입니다. 나머지 연산은 모듈로(Modulo) 연산 이라고도 합니다. 나머지 연…

    wikidocs.net

    음수를 양수로 나머지 연산하기

    나머지 연산자를 활용하지만 아마도 음수의 나머지 연산은 어떻게 동작하는지 생각해 보지 않았을 것입니다. -21이라는 숫자를 5로 나눈 나머지를 구한다고 하겠습니다. 답이 무엇일지 생각해 보시기 바랍니다.

    a = -21
    b = 5
    
    print(a % b)

     

    a라는 숫자를 5로 나눈 나머지가 정답이 되기 때문에 몫이 -4가 되고 나머지는 -1이라고 생각할 수 있습니다. 하지만 실제 나머지 연산을 통해 나오는 값은 4 입니다.

    이 값이 어떻게 나왔을지 생각해 보겠습니다. 파이썬의 나머지 연산의 정의를 보면 다음과 같이 되어 있습니다.

    X == (X // Y) * Y + (X % Y)

    따라서 위 식에 대입하면 다음과 같습니다.

    -21 == (-21 // 5) * 5 + (-21 % 5)

    -21 // 5 는 -4가 아닌 -5가 됩니다. // 기호는 나누어진 값을 내림하는 것입니다. 그래서 파이썬 공식 문서에도 // 기호는 floor division이라 되어 있습니다. -21 / 5는 -4.2 입니다. 이 값을 내림하면 -5가 됩니다. 따라서 -5 * 5 는 -25가 되고 (-21 % 5)는 4가 되는 것입니다.

     

    좀 더 이해하기 쉽게 설명하자면 나머지 연산이란 다음의 식에 따릅니다.

    A = B * n + r

    여기서 n은 B와 곱해서 A를 초과하지 않는 최대의 정수 입니다. 5를 곱해 -21보다 크지 않은 가장 큰 정수는 -5를 곱해 나온 결과인 -25 입니다.  -25에서 4를 더하면 -21이 되기 때문에 나머지 연산의 결과는 4가 되는 것입니다.

    양수를 음수로 나머지 연산하기

    반대의 경우를 생각해 보겠습니다. 21을 -5로 나머지 연산을 하는 경우 입니다.

    a = 21
    b = -5
    
    print(a % b)

    b가 음수이기 때문에 혼란스러울 수 있지만 차근차근 생각하면 이해할 수 있습니다. 21을 -5로 나누면 -4.2가 되고 이 값을 내림하면 -5가 됩니다. -5 * -5는 25가 되고 원래 수인 21이 되기 위해서는 -4를 더해주어야 합니다. 그래서 a % b의 결과는 -4가 됩니다.

    좀 더 쉽게 기억하기

    음수와 양수를 사용한 나머지 연산은 흔하게 나오는 경우는 아닙니다. 따라서 어렵게 생각할 필요 없이 일단 두 수를 나누어 몫을 구합니다. 그리고 몫이 정수가 아닌 실수라면 내림을 해주어 값을 구합니다. 그리고 원래 값이 되기 위해 더해주어야할 값을 찾으면 쉽게 나머지 연산의 결과를 찾을 수 있습니다.

    연습하기

    나머지 연산을 연습하기 위해서 아래 문제를 풀어보시기 바랍니다. 문제의 정의와 파이썬의 // 연산과 % 연산이 좀 달라 생각을 해야 풀 수 있습니다.

    https://www.acmicpc.net/problem/16428

     

    16428번: A/B - 3

    첫째 줄에 A와 B가 주어진다. (-1010000 ≤ A, B ≤ 1010000, B ≠ 0)

    www.acmicpc.net

     

    반응형

    '알고리즘 설명' 카테고리의 다른 글

    교란 순열이란?  (0) 2024.03.22
    한 붓 그리기 가능한 경우  (0) 2024.03.15
    2차원 배열 회전하기  (0) 2024.01.24
    파이썬의 문자를 숫자로, 숫자를 문자로 바꾸기  (0) 2023.11.20
    최소공통조상(LCA)  (0) 2023.10.09