개발

정처기 실기 단골문제, 파이썬 몫 나누기, 나머지 나누기 (/, //, %)

정처기 실기 단골문제, 파이썬 몫 나누기, 나머지 나누기 (/, //, %)
목차
대부분의 프로그래밍 관련 문제에서 단골로 나오는 연산자가 바로 몫 나누기(/, 슬래쉬)와 나머지 나누기(%, 퍼센트)다.
그 중 단골 연산자는 나머지 나누기(%)로 현업에서는 거의 쓰이지 않지만 프로그래밍 문제로는 정말 단골 연산자이다.

프로그래밍에서의 나누기

대부분의 C, C++, Java등에서도 이 나머지 나누기는 예전부터 언어별 차이없이 제공되는 연산자이므로 사람들 뇌리에 쉽게 박혀있다보니 자주나오는거일수도 있겠다.

그리고 다음으로 자주나오는게 몫 나누기(/)이다.
거창하게 몫나누기라고해봤자 우리가 일반적으로 나누기라 하는 기본연산을 지칭하는것이다.

쉽게말해서 7을 2로 나누면 통상적으론 3.5라고 대답하겠지만 여기서 3 부분이 몫이고 0.5부분이 나머지라고 볼 수 있다.
프로그래밍에선 이 부분을 분리해서 다루는데, 그 이유중에 하나가 숫자를 담는 변수의 자료형이 대부분 정수(Integer)이기 때문이다.

* 정수: 소수점을 사용하지않고 나타내는 숫자. 1, 2, 3... 등
* 실수: 소수점을 사용해 나타내는 숫자. 1.5, 3.14, 5.55555... 등

즉 대부분의 프로그래밍 언어에서 정수 7를 2로 나누면 실수 3.5가 나오는게 아니라 정수 3이 프로그램 결과로 나오게 된다.

int number = 7;
print(%d, number / 2); # 3이 출력된다Copy

반대로 이를 소수점이 있는 실수로 표현하고 싶으면 int 자료형이아닌 float, double 등 실수를 처리할 수 있는 자료형을 선언 후 연산을 하면 소수점이 있는 결과가 표기가된다.

float number = 7;
print(%f, number / 2) # 3.5 출력Copy

이런 경우 그냥 '나누기'를 실행한거지 정수형 '몫'을 구하는 나누기를 실행했다는 의미는 아닐것이다.


파이썬에서 나누기

그러면 파이썬에선 이런 나누기는 어떻게 제공될까?
를 알아보기이전에 파이썬에서의 변수 선언에 대해 먼저 이야기해보자.

파이썬을 써본사람은 알다시피 파이썬은 변수 선언시 별도의 자료형을 선언하지 않는다.
알아서 넣어지는 데이터에따라 자료형을 자동으로 생성해주는 동적 타이핑 방식을 채택했다.

그래서 파이썬의 경우에는 아래와 같이 숫자의 나눗셈을 실시하면 의도와 다르게 결과가 출력된다.

print(7 / 2) # 출력: 3.5Copy

프로그래밍좀 해봣던 사람이면 당연히 3으로 나와야하는 결과가 실수형으로 3.5로 나오는 상황이나오는것이다.
이는 파이썬에서 나누기 연산을 기본적으로 '실수'로 처리하기 때문이다.
그러므로 우리가 7 나누기 2를 했을때 3이 나오는 결과를 얻으려면 실제 나누기가아닌 '몫을 구하는 나누기'로 처리해야하는 상황이 필요한것이다.

이를위해 파이썬에선 몫 나누기 연산자를 별도로 아래와 같이 지원한다.

몫 나누기 (//)

print(7 // 2)   # 출력: 3
print(-7 // 2)  # 출력: -4  (버림 방향으로 간다)Copy

슬슬 이해가 되려는 찰나, 갑자기 음수 나누기값이 -3이 아님에 당황했을것이다.
이건또 왜이러냐면 파이썬의 경우에는 몫 나누기(//)를 실행할때 일단 실수로 나눗셈을 계산하고 이후의 나머지 부분을 내림처리(floor)를 하기때문이다.
즉 3.5의 내림처리는 3인거고, -3.5의 내림처리는 -4가 되는 것이다.


나머지 나누기 (%)

다행이 나머지 나누기는 타 언어와 같이 별 특이점은 없다.

print(7 % 3)   # 출력: 1
print(-7 % 3)  # 출력: 2Copy

좀 특이한점이 있다면 음수의 나머지 나누기의 결과값이 무조건 양수로 제공된다는 점이다.
-7을 3으로 나눈다면 몫 -2와 나머지 -0.5로 결과가 나올텐데, 파이썬의 경우 이 나머지를 무조건 양수로 치환(abs)해서 결과로써 제공한다.


몫과 나누기 동시에 얻는법

뭐 이럴일은 거의없겠다만, 몫과 나머지를 동시에 얻는법도 존재한다.

print(divmod(7, 3))    # 출력: (2, 1)
print(divmod(-7, 3))   # 출력: (-3, 2)Copy

연산자까지는 아니고 특정 함수를 사용해서 몫과 나머지를 튜플형식의 데이터로 반환받을 수 있다.


문제

다음 파이썬 코드의 출력결과를 적으시오.
print(-7 // 2)
print(7 % 2)
print(-7 % 2)Copy


해설

1.    -7 // 2
-7 ÷ 2 = -3.5 나눗셈 처리를 먼저 한후, floor 방향으로 내림 → -4 출력

2.    7 % 2
7을 2로 나눈 나머지를 반환함 -> 1 출력

3.    -7 % 2
-7을 2로 나눈 나머지를 반환함, 나머지는 -1이지만 파이썬에서는 나머지를 양수로 치환함. -> 1 출력

결과: -411

#Python
0 개의 댓글
×