[백준 2588번 곱셈] 10강. 백준 단계별로 풀어보기 <1-10>
안녕하세요 밤샘공부입니다~
질문이 있으시면, 아래 오픈채팅방이나 메일로 보내주세요~
2시간 이내에 답변 드리겠습니다.
오픈챗 링크 : https://open.kakao.com/o/srASNxef
메일 주소 : studying.all.night.1114@gmail.com
전달력을 높이기 위해 평어체를 사용하였습니다.
1. 문제 설명
(1) 문제
(세 자리 수) × (세 자리 수)는 다음과 같은 과정을 통하여 이루어진다.![]() (1)과 (2)위치에 들어갈 세 자리 자연수가 주어질 때 (3), (4), (5), (6)위치에 들어갈 값을 구하는 프로그램을 작성하시오. |
(2) 입력
첫째 줄에 (1)의 위치에 들어갈 세 자리 자연수가, 둘째 줄에 (2)의 위치에 들어갈 세자리 자연수가 주어진다. |
(3) 출력
첫째 줄부터 넷째 줄까지 차례대로 (3), (4), (5), (6)에 들어갈 값을 출력한다. |
(4) 예제
① 예시 1
- 입력
472
385
- 출력
2360
3776
1416
181720
2. 문제 해석 및 총평
세자리수 곱하기 세자리수 연산의 세로셈을 python을 이용하여 출력하는 코드를 짜야하는 문제이다. (3), (4), (5)에 해당하는 숫자를 구하기 위해서는 세자리수의 수에서, 자리수 별 숫자를 뽑아내는 방법론을 알아야 한다. 이를 고민하며 문제를 최대한 우아하게 해결해보자.
3. 코드
(1) 모범답안
# 모범답안
num1 = int(input())
num2 = int(input())
#num2의 자리수 별 숫자를 뽑아내는 방법론 1 - 나머지 연산의 응용
num2_1st = num2//100
num2_2nd = (num2//10)%10
num2_3rd = num2%10
num3 = num1*num2_3rd
num4 = num1*num2_2nd
num5 = num1*num2_1st
# 최종답안은 다 더한 것.
num6 = num3+num4*10+num5*100
print(num3)
print(num4)
print(num5)
print(num6)
우리의 사고 과정을 그대로 반영한 풀이이다. 주어진 두 숫자 num1, num2 에서 num1 의 경우는 굳이 자릿수별로 생각해 줄 필요는 없다. (잘 생각해 보라.) 그러나 num2의 경우는 자릿수 별로 쪼개어서 num1과 곱해주어야 하며, 그 결과가 각각 num3, num4, num5가 된다. 이때, 중요한 것은 어떻게 num2의 자릿수를 뽑아 낼 수 있는가? 라는 점이다. 위 모범답안에서는 나머지 연산을 이용하여 차례대로 num2의 첫째 자리 수, 둘째 자리 수, 셋째 자리 수를 뽑아 내었다. 우리는 자리수를 구할 때는 *10으로 나눈 몫과 나머지에 대해 고찰할 필요가 있다. 이후 과정은 어렵지 않게 이해할 수 있을 것이다.
*10으로 나눈 몫과 나머지 : 이 부분이 이해가 안된다면 당장 오픈챗 링크로 들어와 나에게 질문해라! 앞으로 대수 관점의 코딩 문제를 해결할 때 가장 많이 등장하는 주제 중 하나이다. 이해하고 넘어가야 한다.
(2) 추가풀이
# 추가풀이
num1 = int(input())
num2 = list(input()) # 리스트로 입력 받았다. ex. ['3', '8', '5']로 저장될 것이다.
#num2의 자리수 별 숫자를 뽑아내는 방법론 2 - 리스트의 인덱스 활용하기
num2_1st = int(num2[0])
num2_2nd = int(num2[1])
num2_3rd = int(num2[2])
num3 = num1*num2_3rd
num4 = num1*num2_2nd
num5 = num1*num2_1st
# 최종답안은 다 더한 것.
num6 = num3+num4*10+num5*100
print(num3)
print(num4)
print(num5)
print(num6)
과정은 똑같으나 좀 더 list의 인덱스를 이용하여 좀 더 직관적으로 num2의 자릿수를 뽑아 내었다.
(3) 추가풀이
# 추가풀이
num1 = int(input())
num2 = list(input()) # 리스트로 입력 받았다. ex. ['3', '8', '5']로 저장될 것이다.
#num2의 자리수 별 숫자를 뽑아내는 방법론 2 - 리스트의 인덱스 활용하기 (pythonic code)
#res는 [num3, num4, num5] 형태가 된다.
res = [num1*int(i) for i in reversed(num2)]
# 답안을 출력한다.
num6 = 0
for idx, i in enumerate(res) :
print(i)
#num6 값에 연산결과를 계속 더한다.
num6 += i*(10**idx)
print(num6)
좀 더 pythonic하게 해결한 방법이다. 아직은, 이해가 안 될 가능성이 높지만 그래도 위에서 쓰인 함수들이 무엇인지 알고만 가자.
1) reversed : 리스트의 원소를 역순으로 바꾸어 주는 함수이다. ex [1, 2, 3] -> [3, 2, 1]
2) [ i for i in lst ] : 파이써닉한 코드 중 하나로서, for 문을 리스트안에 축약하여 넣을 수 있다. (아직 이해하기 어려울 수 있다.)
3) enumerate : 리스트의 원소 뿐만 아니라 인덱스에 접근하기 위한 파이써닉한 함수 중 하나이다.
(4) 추가풀이
# 추가풀이
num1 = int(input())
res = [num1*int(i)*(10**idx) for idx, i in enumerate(reversed(list(input())))]
# 답안을 출력한다.
for idx, i in enumerate(res) :
print(i//(10**idx))
print(sum(res))
최대한 줄여보았다. (알아보기 힘든 코드이므로, 좋은 코드는 아니다)
'밤샘코딩 > 백준 AtoZ' 카테고리의 다른 글
[백준 10171번 고양이] 12강. 백준 단계별로 풀어보기 <1-12> (0) | 2023.04.21 |
---|---|
[백준 11382번 곱셈] 11강. 백준 단계별로 풀어보기 <1-11> (0) | 2023.04.20 |
[백준 10430번 나머지] 9강. 백준 단계별로 풀어보기 <1-9> (0) | 2023.04.18 |
[백준 18108번 1998년생인 내가 태국에서는 2541년생?!] 8강. 백준 단계별로 풀어보기 <1-8> (0) | 2023.04.17 |
[백준 10926번 ??!] 7강. 백준 단계별로 풀어보기 <1-7> (0) | 2023.04.16 |
댓글
이 글 공유하기
다른 글
-
[백준 10171번 고양이] 12강. 백준 단계별로 풀어보기 <1-12>
[백준 10171번 고양이] 12강. 백준 단계별로 풀어보기 <1-12>
2023.04.21 -
[백준 11382번 곱셈] 11강. 백준 단계별로 풀어보기 <1-11>
[백준 11382번 곱셈] 11강. 백준 단계별로 풀어보기 <1-11>
2023.04.20 -
[백준 10430번 나머지] 9강. 백준 단계별로 풀어보기 <1-9>
[백준 10430번 나머지] 9강. 백준 단계별로 풀어보기 <1-9>
2023.04.18 -
[백준 18108번 1998년생인 내가 태국에서는 2541년생?!] 8강. 백준 단계별로 풀어보기 <1-8>
[백준 18108번 1998년생인 내가 태국에서는 2541년생?!] 8강. 백준 단계별로 풀어보기 <1-8>
2023.04.17