-
[파이썬/Python] 백준 2588번(곱셈) 단계별로 풀어보기 + [문제 완벽 재현! 문제처럼 결과값들 출력하기]깜빡의 취미/파이썬을 합니다. 2021. 7. 18. 15:32728x90
문제는 아래와 같다.
수학적인 사고가 조금 필요한 문제다. 기존에 풀어 왔던 기초 지식을 이용하면 코딩으로 구현하는 건 어렵지 않다. 다만 구현 이전에 '어떻게 할 것인지'에 대한 생각이 꼭 필요한 문제이다.
우선 이번에는 두 줄에 걸쳐 입력을 진행하면 되기 때문에(실제 계산식의 느낌을 주기 위함으로 보인다), 간단하게 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이나 파이참 등에 복사해서 돌려 보시면 바로 이해하실 수 있습니다.
혹시라도 글이 흥미로웠다면, 공감 및 구독 부탁드립니다! 앞으로 더 나은 글 보여드리겠습니다. 감사합니다.
'깜빡의 취미 > 파이썬을 합니다.' 카테고리의 다른 글
[파이썬/Python] 백준 9498번(시험 성적) 단계별로 풀어보기+ [밑으로 갈수록 쉬워지는 답안 3개 모음] (0) 2021.08.01 [파이썬/Python] 백준 1330번(두 수 비교하기) 단계별로 풀어보기 (0) 2021.07.25 [파이썬/Python] 백준 10430번(나머지) 단계별로 풀어보기 + [결과값끼리 같은지 확인하기(feat. 귀차니즘)] (2) 2021.07.11 [파이썬/Python] 백준 10869번(사칙연산) - 단계별로 풀어보기 + [간단한 오류 잡기(feat. 나눗셈)] (0) 2021.07.04 [파이썬/Python] 백준 1008번(A/B) - 단계별로 풀어보기 + [오류 발생시키기에 대한 간단한 언급] (2) 2021.06.27