본문 바로가기

알고리즘

[구현] 백준 1225번 이상한 곱셈 Python 풀이

728x90
반응형

문제 요약

입력받은 수 A와 B가 있다.

A와 B에서 각각 한 자리 씩 뽑아 곱한다. 가능한 모든 조합을 더한 수를 구하라.

(예를 들어, 121*34는 1*3 + 1*4 + 2*3 + 2*4 + 1*3 + 1*4 = 28)

 

👉 백준 1225번 문제 바로가기

입력

첫 행은 A와 B

주어지는 두 수는 모두 10,000자리를 넘지 않는다.

출력

첫째 줄에 결과 출력

입출력 예시

입력 출력
123 45 54

코드

오답 1

약 30분 소요

num1, num2 = input().split()
num1, num2 = list(num1), list(num2)
result = 0

for a in num1:
    for b in num2:
        result += int(a) * int(b)

print(result)

시간 초과

오답 2

from itertools import product

num1, num2 = input().split()
num = [list(map(int, num1)), list(map(int, num2))]

num = list(product(*num))
result = 0

for x in num:
    result += x[0] * x[1]
print(result)

메모리 초과

for문을 반복해서 쓰는 게 문제인가 싶어서 itertools를 활용하여 모든 조합을 만들어준 뒤 계산했다.

정답

num1, num2 = input().split()
num1, num2 = list(map(int, num1)), list(map(int, num2))

print(sum(num1) * sum(num2))

꼭 왜 순서대로 곱해준 다음에 더해야 한다고 생각을 했을까?

더한 후 곱해주면 되는데.

다른 분의 글을 보고 깨달았다.

피드백

어느 정도 시간이 걸릴지 정도는 생각할 수 있어야 하는데.. 오랜만에 해서 그런가 머리가 너무 안 돌아갔다.

규칙을 찾으려고 하지 않고 만드는 방법(오답)은 고정되어 있고 이걸 더 빠르게 어떻게 구현하지??라고 생각하니 정답 코드가 나올 리가 없다.

사고를 좀 더 유연하게 해서 다양한 방법을 생각해보도록 노력하자.

그래도 itertools를 써본 것에 의의를 둔다.

 

깨달은 것

  • itertools를 활용하면 list 내 원소의 모든 조합을 구할 수 있다.
728x90
반응형