📍 python에서 음의 정수를 floor 해보기
프로그래머스 - 기능개발 문제에서 전처리 과정 중 100 - progress[x] // speeds[x]을 해야 하는 과정이 있었는데 나는 나머지가 있는 / 없는 조건을 사용하여 해결했으나 math.floor 혹은 //를 사용하여 해결한 다른 사람의 코드를 봤다.
바로 음수 floor를 사용한 것인데, 지금까지 양수 floor만 사용해봤어서 음수는 어떤 원리로 계산되는지 궁금했다. 먼저 floor의 정의(공식문서)는 다음과 같다. the largest integer less than or equal to x 직역하면 x보다 작거나 같은 가장 큰 정수를 뜻하는데, 말로만 설명해서는 이해가 잘 되지 않을 수 있으니까 예시를 살펴보자. (하단 코드 참고)
from math import floor
# 양수 floor
print(floor(2))
print(floor(2.00001))
print(floor(2.99999))
👉🏽 2
# 음수 floor
print(floor(-2.0001))
print(floor(-2.9999))
print(floor(-3))
👉🏽 -3
코드를 보니 양수일 때는 현재 값보다 작거나 같은 가장 큰 정수는 2인 것을 알 수 있다. 같은 값인데도 불구하고 음수의 경우에는 왜 -2 대신 -3이 나올까?? 예를 들어 -7 // 2연산을 해보자. 한 번에 floor처리를 하면 헷갈릴 수 있으므로 다음의 순서를 생각하며 계산하면 쉽다.
-7 / 2 = -3.5floor처리(x보다 작거나 같은 가장 큰 정수)를 한다.- 7 // 2 = -4가 된다.
더 자세한 설명은 스택오버플로우1, 스택오버플로우2를 참고하자.
번외로, 각 언어를 설계 할 때 정수 나누기를 수행하는 방법은 양의 무한대 혹은 음의 무한대로 반올림하는 경우가 있는데, c는 양의 무한대로 반올림되는 반면, python과 ruby에서는 음의 무한대로 반올림된다. 다음은 각 언어별 음의 정수 나누기 결과표이다.
| Language | Code | Result |
|---|---|---|
| ruby | -1 / 5 | -1 |
| python | -1 / 5 | -1 |
| c | -1 / 5 | 0 |
| clojure | (int (/ -1 5)) | 0 |
| emacslisp | (/ -1 5) | 0 |
| bash | expr -1 / 5 | 0 |
결론: python에서 음의 정수의 나눗셈은 음의 무한대로 반올림한다.
Reference
- 스택오버플로우
'Python > 파이썬 문법 Tips' 카테고리의 다른 글
| [ 파이썬(python) ] 2차원 행렬 시계방향으로 한 칸씩 회전하기 (0) | 2021.07.15 |
|---|---|
| [ 파이썬(python) ] 절사평균과 round(반올림) 함수 그리고 부동소수점 비교 (0) | 2021.07.13 |
| [ 파이썬(python) ] 리스트 중 front, back에서부터 target index까지 어느쪽이 더 가까운지 판단하기 (0) | 2021.06.25 |
| [ 파이썬(python) ] 삼각수(계차수열) 나타내기 (0) | 2021.06.20 |
| [ 파이썬(python) ] 2차원 행렬 시계, 반시계 방향으로 90도 뒤집기 (0) | 2021.06.15 |
댓글