출처: https://meyouus.tistory.com/64 [정보 공유 - For Me For You For Us]
본문으로 바로가기

 

보기에는 쉬워 보인다. 하지만 엄청 애먹었던 문제이다. 일단 내가 짜고 정답으로 맞춘 코드는 다음과 같다:

 

import sys

A = int(sys.stdin.readline())
B = int(sys.stdin.readline())

listB = [int(i) for i in str(B)]

nth_num = 2
nth_digit = 1
sumlist = []
for i in listB:
	sum_num = A*int(listB[nth_num])*nth_digit
	print(int(sum_num/nth_digit))
	nth_num -= 1
	nth_digit *= 10
	sumlist.append(sum_num)
print(sum(sumlist))

굉장히 난잡하다. 일단 설명하자면 다음과 같다

  • Line1~5번은 스킵한다. 기본적인 것이기 때문이다
  • 6 - Line 6는 B 숫자를 list로 쪼개서 만들어준다.
  • 8 - nth_num은 list의 n번째 숫자를 의미한다. (lisB = [1, 2, 3]이면 nth_num = 2인 것은 3이다.)
  • 9 - nth_digit은 1의 자리수, 10의 자리수, 100의 자리수를 의미한다
  • 10 - sumlist도 결국엔 최종적인 곱셈의 값을 더해주기 위해 필요한 리스트를 만들어놓은 것이다
  • 11 - for i in listB → 즉, listB에 있는 i의 개수만큼(3개):

  • 12 - 일단 sum_num, 즉 사진의 (3), (4), (5)의 자릿수 값, 단순히 3776이 아닌 37760, 1416이 아닌 141600, 을 구하기 위한 식이다.
  • 13 - 그리고 이 sum_num을 nth_digit으로 나눈 값을 출력한다. 결국 자릿수 값이 아닌 단순한 3776, 1416 같은 값만 출력해야되기 때문이다.
  • 14 - 이제는 list의 2번째 숫자가 아닌 1번째 숫자로 실행해야 하므로, nth_num에서 1을 빼준다
  • 15 - 그리고 자릿수가 늘어나므로, nth_digit을 10을 곱해준다
  • 16 - 그리고 마지막으로 sumlist에 sum_num의 값을 이어준다.
  • 코드의 for은 listB의 index의 개수만큼 (3개) 실행시킨다.
  • 17 - for문이 끝나고 나면, 지금까지 완성된 sumlist의 합을 구해서 출력한다.

코드랑 설명을 보면 굉장히 난잡하지 않은가? 더 좋은 방법이 있을거라고 생각하긴 했으나 어떻게 해야될지 모르겠어서 다른 개발자들의 블로그를 참고해봤다. 다음은 하나의 예시이다:

inp1 = int(input())
inp2 = int(input())
 
out1 = inp1*((inp2%100)%10)
out2 = inp1*((inp2%100)//10)
out3 = inp1*(inp2//100)
res = inp1*inp2
 
print(out1, out2, out3, res, sep='\n')

출처: <gabii.tistory.com/entry/BaekJoonPython3-%EB%B0%B1%EC%A4%80-2588%EB%B2%88-%EA%B3%B1%EC%85%88>

 

out1, out2, ou3, res로 정의를 한다.

out1에 나타난 ((inp2%100)%10) 은 inp2를 100으로 나누고 남은 숫자 나누기 10으로 나누고 남은 1의 자리이다

out2에 나타난 ((inp2%100)//10) 은 inp2를 100으로 나누고 남은 숫자 나누기 10으로 나눈 몫 (10의 자리수)

out3에 나타난 (inp2//100) 은 inp2를 100으로 나눈 몫이다 (100의 자리수)

res는 단순히 inp1과 inp2를 곱한 값이다.

 

너무나도 간단하게 푸신다;; 아무래도 문제를 푸는것도 중요하지만, 어떻게 더 효율적으로, 데이터를 덜 사용하면서 풀것인가를 고민하면서 푸는 것도 매우 중요한듯 하다.