ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [파이썬/Python] 백준 2588번(곱셈) 단계별로 풀어보기 + [문제 완벽 재현! 문제처럼 결과값들 출력하기]
    깜빡의 취미/파이썬을 합니다. 2021. 7. 18. 15:32
    728x90

    문제는 아래와 같다.

     

    2588번: 곱셈

    첫째 줄부터 넷째 줄까지 차례대로 (3), (4), (5), (6)에 들어갈 값을 출력한다.

    www.acmicpc.net

     

    수학적인 사고가 조금 필요한 문제다. 기존에 풀어 왔던 기초 지식을 이용하면 코딩으로 구현하는 건 어렵지 않다. 다만 구현 이전에 '어떻게 할 것인지'에 대한 생각이 꼭 필요한 문제이다.

     

    우선 이번에는 두 줄에 걸쳐 입력을 진행하면 되기 때문에(실제 계산식의 느낌을 주기 위함으로 보인다), 간단하게 input 함수를 이용하면 된다. input()이라는 기본형을 사용하면 되며, 추가로 정수를 입력할 예정이기 때문에 int 함수로 감싸 준다.

    a = int(input())
    b = int(input())

     

    +) 참고로 input 함수의 괄호 안에 메시지를 적으면, 입력창의 형식으로 출력하는 것도 가능하다.

    >>> input('입력하시오: ')
    입력하시오:

    이제 가장 효율적인 계산을 생각해 볼 차례이다. 핵심은 위 b의 '일의 자리 수, 십의 자리 수, 백의 자리 수를 어떻게 표현할까'이다. 가장 확실한 방법은 나눗셈을 활용하는 것이며, //(몫)과 %(나머지) 모두 적절하게 이용해야 한다.

     

    자세한 내용은 아래의 예시를 참고해 주시길. 십의 자리 수의 경우 여러 가지가 있어 보여드리고자 한다.

    #b의 일의 자리 수
    b % 10	-> 10으로 나눈 나머지 ex. 385/10 = 몫 38 나머지 5
     
    #b의 백의 자리 수 
    b // 100 -> 100으로 나눈 몫 ex. 385/100 = 몫 3 나머지 85
    
    #b의 십의 자리 수
    #1
    (b//10) - ((b//100)*10)	-> 10으로 나눈 몫에서 (100으로 나눈 몫 * 10)을 빼준다.
    
    #2 
    (이 경우 정수형으로 바꿔주지 않으면 소수점이 함께 나오므로 int 함수를 한 번 더 사용해 줍니다)
    int((b%100 - b%10)/10) -> (100으로 나눈 나머지) - (10으로 나눈 나머지)를 해주고 결과값을 10으로 나눠준다.

     

    그렇게 해서 결론적으로 아래와 같은 답안 예시를 보여드릴 수가 있다. 1번과 2번 중 어떤 녀석을 선택할지는 당신의 선택!

    [답안 예시1]
    a = int(input())
    b = int(input())
    print(a * (b%10))
    print(a * ((b//10) - ((b//100)*10)))
    print(a * (b//100))
    print(a * b)
    [답안 예시2]
    a = int(input())
    b = int(input())
    print(a * (b%10))
    print(a * int((b%100 - b%10)/10))
    print(a * (b//100))
    print(a * b)

    개인적인 호기심으로, 여기서 한 발짝 더 나가봤습니다. 문제에서 출력하는 것처럼 해주면, 마치 자동 계산식처럼 되지 않을까? 그냥 보기에 좀 더 좋지 않을까...?

     

    아무래도 식 모양 자체를 문제에서 보여준 것과 같이 하려면, 간격 등을 고려해서 줄을 배치해야 한다. 이럴 때 쓸 수 있는 게 문자열 포맷팅이다. 이를 위해, 우선 우리가 앞서 정리한 식들을 특정 기호에 대입해 준다. [답안 예시 1]을 따른 식은 다음과 같다.

    a = int(input())
    b = int(input())
    w = a * (b%10)
    x = a * ((b//10) - ((b//100)*10))
    y = a * (b//100)
    z = a * b

     

    이제 구현을 위해 f 포맷팅 기법을 살펴 보자. 아래와 같이 문자열 앞에 f를 작성하고, 문자열 안에 추가하고 싶은 값을 {}(중괄호)로 덮어 주자.

    >>> a = int(input())
    123
    >>> print(f'오늘은 공부를 시작한지 {a}일 째 됩니다.')
    오늘은 공부를 시작한지 123일 째 됩니다.

     

    f 포맷팅에는 정렬 기능도 있다. 아래와 같이 작성하면 간격도 지정할 수 있다. 아래의 예시를 살펴보자. 위에서부터 각각 왼쪽 정렬, 가운데 정렬, 오른쪽 정렬이다. 

    >>> a = 12345
    >>> print(f'{a:<10}')
    12345
    >>> print(f'{a:^10}')
      12345
    >>> print(f'{a:>10}')
         12345

     

    참고로 오른쪽의 숫자는 임의로 지정한 문장 길이다. 보기 좋게 중간에 '=' 기호를 추가해 보겠다.

    >>> a = 12345
    >>> print(f'{a:=<10}')
    12345=====
    >>> print(f'{a:=^10}')
    ==12345===
    >>> print(f'{a:=>10}')
    =====12345

     

    마지막으로 join 함수를 살펴보자.  ','.join('문자열')의 형태가 기본적인데, 문자열 각각에 특정 문자를 넣어 준다. 공백도 넣어준다.

    >>> ' '.join('12345')
    '1 2 3 4 5'

    이제 풀이를 위한 공식은 모두 모였다. 탄생한 식을 공유해 본다. 간격은 직접 조정해 보면서 맞췄다. 완벽하게 같지는 않지만, 그래도 곱셈이 되는 듯한 분위기를 내고자 했다. 

    a = int(input())
    b = int(input())
    w = a * (b%10)
    x = a * ((b//10) - ((b//100)*10))
    y = a * (b//100)
    z = a * b
    
    print(' '.join(f'{a:>6}'))
    print(X ' '.join(f'{b:>4}'))
    print('-'*12)
    print(' '.join(f'{w:>6}'))
    print(' '.join(f'{x:^7}'))
    print(' '.join(f'{y:^5}'))
    print('-'*12)
    print(' '.join(f'{z:>6}'))

     

    출력된 결과값은 아래와 같다. 솔직히 아직 많이 부족하지만, 이 정도면 최선을 다했다... 고 생각한다.

     


    여기서 한 번만 더 뇌절해 보기로 했다. 시간 차를 두고 식이 나오게끔 해주는 방식이다. import time 및 time.sleep을 이용했다. 쉽게 말씀드리면, import time은 시간에 관한 식을 사용할 수 있는 time 라이브러리를 사용하겠다는 의사 표시이고, 이 때time.sleep()이라는 함수를 이용하면 아랫줄이 일정 시간 지나서 작동한다.

    import time
    a = int(input())
    b = int(input())
    w = a * (b%10)
    x = a * ((b//10) - ((b//100)*10))
    y = a * (b//100)
    z = a * b
    
    print(' '.join(f'{a:>6}'))
    print(' '.join(f'X {b:>4}'))
    print('-'*12)
    time.sleep(1)	-> 아랫줄을 1초 있다 보여 주세요! 라는 뜻
    print(' '.join(f'{w:>6}'))
    time.sleep(1)
    print(' '.join(f'{x:^7}'))
    time.sleep(1)
    print(' '.join(f'{y:^5}'))
    print('-'*12)
    time.sleep(1)
    print(' '.join(f'{z:>6}'))

     

    설명이 조금 복잡할 수 있지만, 이 녀석을 IDLE이나 파이참 등에 복사해서 돌려 보시면 바로 이해하실 수 있습니다. 

     

    혹시라도 글이 흥미로웠다면, 공감구독 부탁드립니다! 앞으로 더 나은 글 보여드리겠습니다. 감사합니다.

     

    댓글

Designed by Tistory.