반응형

안녕하세요 밤샘공부입니다~

백준 2588번

질문이 있으시면, 아래 오픈채팅방이나 메일로 보내주세요~

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

   최대한 줄여보았다. (알아보기 힘든 코드이므로, 좋은 코드는 아니다)

반응형