이번 시간에은 파이썬 divmod 메서드에 대해 알아봅시다.

 

 x와 y를 받으면 x를 y로 나눈 몫과, 나머지가 들어있는 tuple을 리턴하게 됩니다. 튜플은 for in으로 순회 가능합니다. 이를 이용해서 여러가지 작업을 해 보도록 하겠습니다.

 


 이걸 어디에 써 먹을 수 있을까요? 7을 3으로 나눈 몫과 나머지를 구해야 한다고 생각해 봅시다.

 

 저는 처음에 이런 식으로 썼었습니다. 7 // 3과 7 % 3을 썼었습니다. 7 / 3을 쓰지 않았음에 주의하세요. 7 / 3의 결과는 7을 3으로 나눈 몫인 2가 아닌 2.333..이 나오게 됩니다.

 

 결과는 2 1이 나옵니다. 문제는 저렇게 쓰기가 귀찮다는 것입니다. 이런 귀찮음을 해결하기 위해, divmod를 쓴다는 것을 최근에야 알게 되었습니다.

 

 

 이 메서드의 리턴값은 튜플입니다. a, b = divmod(7, 3)이면 7을 3으로 나눈 몫이 a로 들어가고, 7을 3으로 나눈 나머지가 b로 들어가게 될 겁니다.

 

 결과는 위와 같습니다.

 


 

 이제, 이 결과에서 1씩 더해야 하는 상황을 생각해 봅시다. 예를 들어 6을 3으로 나눈 몫과 나머지는 2, 0인데, 이 값들을 각각 1씩 더해서 3, 1로 만들어야 하는 상황입니다. 실제로 제가 ps를 하면서 심심찮게 접했던 상황 중 하나입니다. 일단, 해당 함수로 몫과 나머지를 빼낸 다음에 몫에다가 1을 더한 결과와, 나머지에다가 1을 더한 결과를 빼낼 수도 있어요. 2번째 줄에 f-string으로 a+1과 b+1을 출력했음을 알 수 있어요.

 

 기능이 수행되는 데에는 문제가 없어 보이긴 하네요. 그런데, 뭔가 지저분해 보입니다.

 

 

 이렇게 바꿔 봅시다. 1번째 줄에 a, b = (k+1 for k in divmod(6, 3))이라고 되어 있는데요.

 

 이 k+1은 위 프로그램의 for loop를 돌면서 출력하는 수들입니다. 그러면 순서대로 3, 1이 될 겁니다.

 

 

 실행 결과는 위와 같습니다. 여담으로, (k+1 for k in divmod(6, 3))의 type을 찍어보면 generator라고 나오는데요. 이에 대해서는 키워드 yield를 같이 하면서 알아보도록 하겠습니다. 제가 개최한 코딩 테스트 대회를 푸신 분이 언급해 주신 키워드여서, 정리해 보아야 할 듯 싶네요.