알고리즘 연습/수학, 정수론, 기하

[🥉2 / 백준 1225 / 파이썬] 이상한 곱셈

김세진 2021. 7. 18. 23:17
반응형

 

 

1225번: 이상한 곱셈

첫째 줄에 A와 B가 주어진다. 주어지는 두 수는 모두 10,000자리를 넘지 않는다.

www.acmicpc.net

문제

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))

 

반응형