나눗셈 결과 몫 … 나머지로 표시하기

이거 참고로 노션에는 기록을 못한다… 차마 기록할 페이지를 어디다 만들어야 할 지 모르겠음… ㅋㅋㅋㅋㅋ

문방구 오락기에서 게임하다가 엄마한테 등짝맞던 시절… 아니 그니까 초딩때를 이야기하는거다. 아무튼, 우리가 나눗셈을 처음 배웠을 때 6 나누기 4는 몫이 1이고 나머지가 2라 1 … 2 이런 식으로 표현했다. 근데 콤퓨타는 기본적으로 몫과 나머지따원 모르겠고 난 소수점으로 쫑낼것이다! 모드란 말이죠.

그니까 응애 애기피츄 책사죠 하던 시절의 그 나눗셈을 해보자 이겁니다. 뭘로? 파이썬으로. 왜 피츄인지는 내 닉네임을 보면 납득할 수 있을것이다. 본인이 라이츄기 때문에 유년기가 피츄인거다.


일단 나눗셈의 용어에 대해 알고 가도록 하자. 나눗셈 하면 피제수와 제수라는 두 개의 용어가 있는데(몫과 나머지도 있지만), 피제수는 나눠지는 수, 제수는 나누는 수이다. 6 나누기 3에서 6은 피제수, 3은 제수다.

전에 백준 풀이에서 부정과 불능에 대해 얘기하면서 0 나누기 0을 하게 되면 0을 빼고빼고빼고빼고빼고빼고…빼고 해야돼서 안 끝난다고 했는데, 그렇다. 피제수에서 제수를 겁나 빼는게 나눗셈이다. 30 나누기 5 하면 30에서 5를 여섯 번 빼면 된다. 언제까지? 0 될때까지. 나머지가 있다면 언제까지? 0보다 크고 제수보다 작을때까지.

import sys

X = int(sys.stdin.readline()) # 피제수
Y = int(sys.stdin.readline()) # 제수
cnt = 0

while X >= Y:
    X -= Y
    cnt += 1

print(cnt, X)

여기서 cnt는 몫이고, X는 피제수(였던것)가 된다. 왜 였던것이냐면 피제수가 제수보다 클때까지 빼고빼고빼고빼고…빼서 제수보다 작아지면 while문을 빠져나오기 때문.

import sys

X = int(sys.stdin.readline()) # 피제수
Y = int(sys.stdin.readline()) # 제수
cnt = 0

while X >= Y:
    X -= Y
    cnt += 1

print('{} ... {}'.format(cnt,X))

이렇게 하면 몫 … 나머지로 출력되는데 아직 한가지 더 남았다. 나머지가 0이면?

import sys

X = int(sys.stdin.readline()) # 피제수
Y = int(sys.stdin.readline()) # 제수
cnt = 0

while X >= Y:
    X -= Y
    cnt += 1

if X == 0:
    print('{}'.format(cnt))
else: 
    print('{} ... {}'.format(cnt,X))

아니 이게 클때로 조건을 걸어두니까 피제수에서 제수 뺄 수 있는데 걍 나머지로 짬때리더라고… 그래서 등호 추가했다. 이러면 피제수와 제수가 같아질때 한번 더 빼고 나머지가 0이 된다. 아무튼… 이렇게 if문을 추가하면 나머지가 없을때는 몫만, 나머지가 있을때는 몫 … 나머지로 출력해준다.

import sys

X = int(sys.stdin.readline()) # 피제수
Y = int(sys.stdin.readline()) # 제수
cnt = 0

while True:
    if X < Y:
        break
    X -= Y
    cnt += 1

if X == 0:
    print('{}'.format(cnt))
else: 
    print('{} ... {}'.format(cnt,X))

이건 While True 버전. While True는 위의 while문에 있던 조건문이 if+break 2+1 패키지로 들어간다.

일단 for문은 여기서부터 여기까지 해라지 조건부 반복문이 아니기때문에 while만 해봤는데, 이거 굳이 반복문 써야 하나요? 아뇨, 더 간소화 할 수 있는 방법이 있습니다.

import sys

X = int(sys.stdin.readline()) # 피제수
Y = int(sys.stdin.readline()) # 제수

if X % Y != 0:
    print('{} ... {}'.format(X // Y, X % Y))
else: 
    print(X // Y)

X // Y는 몫(int(X/Y)와 같음), X % Y는 나머지다. 그러니까 X를 Y로 나눈 나머지가 0이 아니면 몫 … 나머지로, X를 Y로 나눈 나머지가 0이면 몫만 출력하면 된다. ㅇㅋ?