본문 바로가기

알고리즘 공부/알고리즘 구현 기초

백준) 곱셈-파이썬

문제

https://www.acmicpc.net/problem/2588

(브론즈 3 문제)

 

2588번: 곱셈

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

www.acmicpc.net

입력

472
385

출력

2360
3776
1416
181720

내 코드

a=int(input())
b=str(input())
list=[]
for i in b:
    list.append(i)
third=a*int(list[2])
fourth=a*int(list[1])
fifth=a*int(list[0])
print(third)
print(fourth)
print(fifth)
print(fifth*100+fourth*10+third)

풀이(생각 과정)

처음에 문제를 보고 리스트를 이용해서 2번째 입력 값을 숫자 1개씩 나눠서 곱셈을 해야겠다고 생각했다.

 

즉 예제 입력 값인 472에 5를 곱하고 그 후 8을 곱하고 3을 곱하고 이런식으로 (3),(4),(5) 값을 도출하려고 한 것이다.

 

그 후 (3)x100+(4)x10+(5) 식을 이용해서 (6)의 값을 출력하는 형태로 구현했다.

 

 

개선점

1번째로 입력값을 각각 따로 받는 형태였으나 생각을 하지 않고 a,b=map(int,input().split())을 통해서 입력을 받으려고 했었다.

이로 인해서 입력 값 자체를 문제에서 받아들이지 못해서 ValueError가 발생했었다.

 

2번째로 파이썬의 기초가 모자라서 바로 생각이 나지 않아서 굳이 str로 변환을 해서 두 번째 인수를 받았다.  b의 인수를 받는 과정에서 String 형태로 바꿀 필요 없이 바로 input을 통해서 입력을 받을 수 있었다.

b=input()의 형태로 입력을 받을 경우 b는 문자열의 형태로 입력을 받게 된다.

또한 이렇게 문자열을 받을 경우 굳이 리스트를 생성할 필요 없이 b[0]과 같은 방법으로 b의 요소를 하나씩 받을 수 있다.

이 문제에서는 리스트를 생성하고 반복문을 통해서 다시끔 리스트에 넣는 작업은 할 필요가 없는 것이였다.

 

개선 코드1

 

a=int(input())
b=input()
third=a*int(b[2])
fourth=a*int(b[1])
fifth=a*int(b[0])
print(third)
print(fourth)
print(fifth)
print(fifth*100+fourth*10+third)

개선점을 바탕으로 개선을 한 코드이다.

 

다른 풀이

 

A = int(input())
num = int(input())

print(A * (num % 10))
print(A * ((num % 100) // 10))
print(A * (num // 100))
print(A*num)

나와는 다른 방향성을 가지고 푼 코드이다.

 

2번째 인수를 굳이 하나씩 분할하지 않고 나머지, 몫 계산을 통해서 구현한 코드이다.

 

실제 예제인 385의 경우 %10을 이용하면 1의 자리를 구할 수 있고, %100을 하면 10의 자리를 구할 수 있고 몫을 이용해서 100의 자리를 구할 수 있다.

 

수학적 계산을 통해서 구현한 것을 보고 하나의 방법만 생각하는 것이 아닌 여러가지 방향으로 생각하는 힘을 길러야 한다는 것을 깨달았다.