Skip to content

Latest commit

 

History

History
107 lines (64 loc) · 3.94 KB

File metadata and controls

107 lines (64 loc) · 3.94 KB

문제2

문제

두 수(a, b)를 입력받고 a를 b로 나눈 몫과 a를 b로 나눴을 때의 나머지에 대해서 구하시오


my solution

print(int(a/b), a%b)

나에겐 너무 자연스러운 풀이이다. a와 b를 나눈 값을 소수점 아래는 버림하여 몫을 구한다. 나머지는 나머지 연산자로 구한다. 자바스크립트 역시 (아래와 같은) 비슷한 방식으로 해결한다.

console.log(Math.floor(a / b), a % b);

pythonic solution

그런데 파이썬은 다름이 있다. 물론 다른 메소드들이 있다.

# 1)
print(a//b, a%b)

# 2)
print(*divmod(a, b))

알아보기

a, b = map(int, input().strip().split(' '))

앞에서 배운 map() 메소드이다. 그런데 중간에 strip()이라는 메소드가 있다. 이 메소드는 문자열의 양 끝에 공백과 ₩n을 제거해준다.


// operator

파이썬에 이런 연산자가 있는 줄은 꿈에도 몰랐다. // 는 몫을 반환해주는 연산자이다. 정확히 말하면, 나누기를 하여 소수점이하의 수를 버리고 정수만을 반환한다.


divmod(a,b)

이런 대단한 연산자!! 이것은 몫과 나머지를 한방에 반환해준다. 첫번째 인자를 두번째 인자로 나눈 몫과 나머지를 튜플 형식 (몫, 나머지) 으로 반환한다. 한 번에 다 나와서 요긴하게 사용할 수 있을 것 같다.

그런데 이 메소드가 항상 좋은 것은 아니라고 한다. // 연산자를 사용하는 것이 가독성 측면에서 좋고 또 작은 숫자들을 계산할 때는 성능이 더 좋다고 한다. 큰 숫자를 계산하는 경우에는 divmod()를 사용하는 것이 더 좋다고 한다. 상황에 맞게 사용하도록하자.

여기서 잠깐 print(*divmod(a, b))에서 *는 무슨 의미인거지??

*Asterisk 라고 부른다. * 는 4가지 기능을 가진다고 한다. 어떤 기능이 있는지에 대해서 알아보자.

  • 곱셈 및 거듭제곱 연산

      2 * 3 = 6
      2 ** 3 = 2 * 2 * 2  = 8
  • 리스트형 컨테이너 타입의 테이터를 확장, 반복하고 싶을 때

      number_list = [1, 2, 3]
      number_list * 5
      > [1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3]
  • 가변인자(Variadic Parameter)를 사용하고자 할 때 ⭐️

    가변인자란 인자가 동적으로 변하는 인자를 말한다. 예를 들어 인자를 몇 개 받아야할지 모르는 경우나, 어떤 인자라도 모두 받아서 처리해야하는 경우는 가변인자가 필요하다.

    파이썬에는 인자는 두 종류가 있다. Positional Arguments와 Keyword Arguments 이다. 전자는 인자가 위치에 따라서 정해지는 것이고 후자는 키워드, 이름을 가진 인자를 뜻한다. Positional Arguments는 개수대로 정해진 위치로 인자를 전달해야한다. Keyword Arguments는 키워드만 같은면 받을 수 있기 때문에 기본값을 설정할 수 있고, 생략이 가능하다.

    *args : 임의의 개수의 Positional arguments를 받음을 의미, 이 형태로 가변인자를 packing하여 튜플에 저장된다.

    **kwargs : 임의의 개수의 Keyword arguments를 받음을 의미, 이 형태로 가변인자를 packing하여 딕셔너리에 저장된다.

  • 컨테이너 타입의 데이터를 Unpacking 할 때

    number_list = [1, 2, 3]
    def print_list(*numbers){
      #code...
    }
    
    print_list(*number_list) # 1) 1 2 3
    
    pritn_list(number_list) # 2) [1, 2, 3]

    #1과 #2가 사용이 다르다. 1)의 경우에는 리스트가 unpacking되어서 numbers로 전달된다.(마치 자바스크립트의 spread operator와 같은 기능이다.) 반면 2)의 경우에는 리스트가 그대로 전달되어서 numbers가 list를 받게 된다.



참고

파이선의 * 이해하기