반응형
문제
A*B를 계산하다 지겨워진 형택이는 A*B를 새로운 방법으로 정의하려고 한다.
A에서 한 자리를 뽑고 * B에서 임의로 한 자리를 뽑아 곱한다.
의 가능한 모든 조합 (A가 n자리, B가 m자리 수라면 총 가능한 조합은 n*m개)을 더한 수로 정의하려고 한다.
예를 들어 121*34는
1*3 + 1*4 + 2*3 + 2*4 + 1*3 + 1*4 = 28
이 된다. 이러한 형택이의 곱셈 결과를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 A와 B가 주어진다. 주어지는 두 수는 모두 10,000자리를 넘지 않는다.
출력
첫째 줄에 형택이의 곱셈 결과를 출력한다.
예제 입력123 45 |
예제 출력54 |
풀이
각 자리수를 번갈아가며 곱하여 더한 값을 구하는 문제이다.
단순히 무식하게 풀자면 반복문 두 개를 써서 구할 수 있겠다.
a,b = input().split()
r=0
for i in a:
for j in b:
r += int(i)*int(j)
print(r)
하지만 위 코드의 경우 시간초과가 발생한다.
각 숫자는 최대 10,000자리의 수로 구성이 될 수 있기 때문에, 약 10^8의 연산이 발생할 수 있다.
따라서 공식을 보고 패턴을 찾아야 할 필요가 있다.
공식을 조금 변형해보도록 하자.
1*3 + 1*4 + 2*3 + 2*4 + 1*3 + 1*4 = 28
1*(3+4) + 2*(3+4) + 1(3+4) = 28
(1+2+1)*(3+4) = 28
정답을 구했다. 각 숫자를 자리별로 더한 뒤 곱해주기만 하면 된다.
a,b = input().split()
a = list(map(int,a))
b = list(map(int,b))
print(sum(a) * sum(b))
반응형
'알고리즘 연습 > 수학, 정수론, 기하' 카테고리의 다른 글
[🥉2 / 백준 13458 / 파이썬] 시험 감독 (0) | 2021.09.05 |
---|---|
[🥈3 / 백준 1004 / 파이썬] 어린 왕자 (0) | 2021.08.31 |
[🥉3 / 백준 1009 / 파이썬] 분산처리 (0) | 2021.07.08 |
[백준 1002] 기본 수학 2 - 터렛 (0) | 2021.05.30 |
[백준 3053] 기본 수학 2 - 택시 기하학 (0) | 2021.05.30 |