몽-구
몽구의 우당탕탕 개발 공부
몽-구
전체 방문자
오늘
어제
  • 분류 전체보기 (106)
    • PS (38)
      • 백준 (24)
      • 프로그래머스 (14)
    • Dev (58)
      • Kotlin (0)
      • Java (4)
      • Spring, SpringBoot (1)
      • C (8)
      • Python (10)
      • Dart (1)
      • 알고리즘 (7)
      • 자료구조 (3)
      • Git (1)
      • Linux (2)
      • VS Code (1)
      • 환경 설정 (8)
      • Conference (1)
      • 42Seoul (3)
      • Node.js (1)
      • ShellScript (1)
      • IntelliJ (0)
      • MacOS (2)
      • 기타 (3)
    • CS (1)
      • 데이터베이스 (1)
    • DS (4)
      • Coursera (4)
    • 리뷰 (1)
      • 제품 리뷰 (1)
    • 일상 (3)
      • 자동화 (1)
      • 목표 및 계획 (2)
      • 회고 (0)
    • 삶에 대한 태도 (1)
      • 유튜브를 보며 (1)

블로그 메뉴

  • GitHub

인기 글

반응형

태그

  • 알고리즘
  • 프로그래머스
  • Algorithm
  • BOJ
  • 코딩테스트
  • Linux
  • 백준알고리즘
  • 정렬
  • 파이썬
  • 백준
  • 백준온라인저지
  • sort
  • c언어
  • Python
  • 리눅스

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
몽-구

몽구의 우당탕탕 개발 공부

[파이썬/Python] divmod와 언패킹(unpacking)을 활용하여 몫과 나머지 구하기
Dev/Python

[파이썬/Python] divmod와 언패킹(unpacking)을 활용하여 몫과 나머지 구하기

2020. 2. 24. 17:41
반응형

a와 b라는 수가 주어진 후, a과 b를 나눈 몫과 나머지를 구하는 연산은 무엇일까?

 

1. 몫을 구하는 연산자 //, 나머지를 구하는 연산자 %를 통해 출력

a = 5
b = 3
print(a//b, a%b) # 출력값 : 1 2

많은 사람들이 위와 같이 코드를 짤 것이라고 생각한다. 나 또한 위처럼 짰다. 하지만 프로그래머스 인강 '파이썬을 파이썬답게'에서는 몫과 나머지를 한꺼번에 구하는 내장 함수 divmod와 unpacking 기법을 활용하여 몫과 나머지를 구하는 방법을 알려준다.

 

 

2. 몫과 나머지를 한꺼번에 구하는 내장 함수 divmod와 unpacking을 통해 출력

a = 5
b = 3
print(*divmod(a, b)) # 출력값 : 1 2

python 내장함수 중 divmod는 복소수가 아닌 두 개의 숫자를 인자로 취하고 정수 나누기를 사용할 때의 몫과 나머지로 구성된 한 쌍의 숫자를 튜플의 형태로 반환한다. 자세한 설명은 여기와 여기를 눌러보자.

 

우리가 구하고자 하는 출력값의 형태는 int형으로 된 숫자가 ' ' 기준으로 구분되어 출력되는 것이기 때문에, 튜플의 형태로 반환해주는 divmod의 결과값을 unpacking 해줘야 한다.

 

unpacking을 설명하기에 앞서 packing에 대해 간략히 말해보자.

 

packing은 인자로 받은 여러 개의 값을 하나의 객체로 합쳐서 받을 수 있도록 해준다. 즉, 어떠한 함수를 정의할 때 def function(*arg): 와 같은 식으로 하면, 인자가 몇 개가 들어오던 그 인자를 하나의 객체로 합쳐준다. 그렇게 되면 함수 내에서 하나의 객체로 합쳐진 다수의 모든 인자에 대해 함수 내의 기능을 수행해준다.

def function(*arg):
	print(arg)
	print(type(arg))

function(1,2,3) 
''' 출력값 :
(1, 2, 3)
<class 'tuple'>
'''

더욱 풍부하고 자세한 이야기는 여기서 확인하자.

 

unpacking이란, packing과 반대되는 개념으로 여러 개의 객체를 포함하고 있는 하나의 객체를 풀어서 보여주는 것이라고 생각하면 좋다. 다만, unpacking은 함수를 호출할 때 인자를 해체하는 개념이기 때문에, 해체된 결과가 함수의 매개변수에 개수와 다르다면 에러가 발생한다고 한다.

 

함수 divmod의 반환값을 왜 unpacking해서 출력해야 할까? 다음의 코드를 보면 조금 더 쉽게 이해할 수 있을 것이다. 쉬운 이해를 위해 아래의 코드들은 IDLE에서 진행했다.

# 튜플이라는 하나의 객체 내에 속해있는 각각의 객체들을 unpacking
>>> a = (4, 8, 12, 2, 'a')
>>> type(a)
<class 'tuple'>
>>> print(a)
(4, 8, 12, 2, 'a')
>>> print(*a)
4 8 12 2 a
# 4, 8, 12, 2 라는 int형 객체와, 'a'라는 str형 객체를 각각 반환


# 리스트도 마찬가지로 가능
>>> b = ['지금', '배가', '고프다', 2020, 2, 24]
>>> type(b)
<class 'list'>
>>> print(b)
['지금', '배가', '고프다', 2020, 2, 24]
>>> print(*b)
지금 배가 고프다 2020 2 24
# '지금', '배가', '고프다' 라는 str형 객체와 2020, 2, 24 라는 int형 객체를 각각 반환


# 그렇다면 함수 divmod의 결과값도 unpacking해보자.
>>> print(divmod(7,4))
(1, 3) # 튜플 형태의 하나의 객체를 반환
>>> print(*divmod(7,4))
1 3 # 튜플 내 1과 3이라는 int형 객체를 각각 반환

 

여기서 잠깐! 굳이 왜 1번이라는 쉬운 방법을 놔두고 조금 더 복잡하게 생각해야 하는 2번을 소개해준 것일까? 어느 정도의 작은 숫자까지는 1번 방법이 2번 방법에 비해 연산 속도가 더 빠르다. 하지만, 아주 큰 숫자를 계산해야 할 때는 2번 방법이 더욱 좋은 퍼포먼스를 낸다. (여기를 통해 확인)

 

다만, 개인적으로 timeit 모듈을 활용하여 계산해보니 위 문단에서 예시를 든 어마 무시한 숫자가 아닌 이상은 1번 방법이 더 효율적인 것을 확인했다. 과연 이것을 내가 코딩테스트 문제 풀 때 쓰게 될지는 모르겠다... 하지만 이러한 방법이 있다는 것, 그리고 packing과 unpacking에 대해 더 알아갈 수 있는 좋은 공부가 되었다.

 

 

Source :

1. 프로그래머스, <파이썬을 파이썬답게>

2. 파이썬 공식 document

3. 위키독스, <제대로 파이썬>

4. 위키독스, <점프 투 파이썬>

 

반응형
저작자표시 (새창열림)

'Dev > Python' 카테고리의 다른 글

[파이썬/Python] 리스트의 정렬 방법 - sort함수와 sorted함수  (0) 2020.03.11
[파이썬/Python] 순열과 조합 (Permutation and Combination)  (0) 2020.03.10
[파이썬/Python] 재귀함수(Recursive function)와 메모이제이션(Memoization)  (2) 2020.03.02
[파이썬/Python] 리스트 안에서 반복문, Comprehension  (0) 2020.02.27
[파이썬/Python] 진법 변환 함수 - int( )  (0) 2020.02.24
    'Dev/Python' 카테고리의 다른 글
    • [파이썬/Python] 순열과 조합 (Permutation and Combination)
    • [파이썬/Python] 재귀함수(Recursive function)와 메모이제이션(Memoization)
    • [파이썬/Python] 리스트 안에서 반복문, Comprehension
    • [파이썬/Python] 진법 변환 함수 - int( )
    몽-구
    몽-구
    소망보단 목표를, 생각보단 실천을

    티스토리툴바