SWLUG(2025)/Algorithm

[2학기 5주차] 이상한 곱셈, Shares

batterygj 2025. 11. 5. 01:24

문제

A×B를 계산하다 지겨워진 형택이는 A×B를 새로운 방법으로 정의하려고 한다.

A에서 한 자리를 뽑고 × B에서 임의로 한 자리를 뽑아 곱한다.

의 가능한 모든 조합 (A가 n자리, B가 m자리 수라면 총 가능한 조합은 n×m개)을 더한 수로 정의하려고 한다.

예를 들어 121×34는

1×3 + 1×4 + 2×3 + 2×4 + 1×3 + 1×4 = 28

이 된다. 이러한 형택이의 곱셈 결과를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 A와 B가 주어진다. 주어지는 두 수는 모두 10,000자리를 넘지 않는 음이 아닌 정수이다. 수가 0인 경우에는 0만 주어지며, 그 외의 경우 수는 0으로 시작하지 않는다.


 

if) 123 54가 주어지는 경우

result = 1 * 5 + 2 * 5 + 3 * 5 + 1 * 4 + 2 * 4 + 3 * 4 이다.

이 식을 정리해보면 

5 * ( 1 + 2 + 3 ) + 4 * ( 1 + 2 + 3 ) = ( 1 + 2 + 3 ) * ( 5 + 4 ) 이므로

A의 모든 자릿수를 더한 값과 B의 모든 자릿수를 더한 값을 구한 뒤 이 두 합을 곱하는 것과 같다. -> 가장 효율적인 계산 방법!

 

import sys

try:
    A, B = sys.stdin.readline().split()
except:
    exit()

sum_A = sum(map(int, A))
sum_B = sum(map(int, B))

result = sum_A * sum_B

print(result)

 

0. import sys : 긴 문자열 형태의 입력을 효율적으로 읽기 위해 주로 사용

1. 입력받은 것을 공백을 기준으로 나눠 A, B에 각각 저장

2. exit() : 입력 처리 중 오류가 발생하면 프로그램을 종료

3. map(int, A) : 문자열 A의 각 문자(자릿수)를 정수형으로 변환하여 순서대로 나열하는 맵 객체를 생성   ex) "123"이 1, 2, 3으로 변환됨

4. map 객체에 있는 모든 숫자를 더해 sum_A에 저장. 같은 방법으로 sum_B에도 저장

5. sum_A와 sum_B를 곱한 값을 result에 저장하고 result를 출력

 

 


 

문제

A group of N persons and the ACM Chief Judge share equally a number of S shares (not necessary all of them). Let x be the number of shares aquired by each person (x must be an integer). The problem is to compute the maximum value of x.

Write a program that reads pairs of integer numbers from an input text file. Each pair contains the values of 1 ≤ N ≤ 10000 and 1 ≤ S ≤ 109 in that order. The input data are separated freely by white spaces, are correct, and terminate with an end of file. For each pair of numbers the program computes the maximum value of x and prints that value on the standard output from the beginning of a line, as shown in the example below.

예제 입력 1 

1 100
2 7
10 9
10 10

예제 출력 1 

50
2
0
0

 


1. 위원장과 N명의 사람이 s개의 주식을 동등하게 나눠가져야하므로 총 인원 수는  N + 1

 

import sys

def solve():
    d = sys.stdin.read().split()
    r = []
    
    for i in range(0, len(d), 2):
        if i + 1 < len(d):
            n = int(d[i])
            s = int(d[i+1])
            r.append(str(s // (n + 1)) + '\n')
            
    sys.stdout.write("".join(r))

solve()

 

1. 입력받은 것을 공백을 기준으로 나눠 리스트를 생성해 d에 저장

2. 빈 리스트 r 생성

3. i는 0부터 d의 길이-1까지 2씩 커지면서 다음을 반복

4. i + 1 ( d에서는 (N, S) 쌍으로 주어지고 i 는 N이므로 i + 1은 S ) 이 d의 길이보다 작으면 d[i]를 정수형으로 변환해 n에 저장 d[i+1]을 정수형으로 변환해 s에 저장

5. 리스트 r의 맨 끝에 s를 n+1로 나눈 몫을 문자열로 변환하고 줄바꿈과 함께 추가

6. r : 계산된 주식 개수와 줄바꿈 문자를 포함하는 문자열 리스트

" ".join(r) : 리스트 r에 있는 모든 문자열 요소를 빈 문자열 " " 을 구분자로 사용하여 하나의 거대한 문자로 합치는(join) 역할

sys.stout : 파이썬이 표준출력 스트림에 데이터를 보낼 때 사용하는 파일 객체

.write() : 인수로 받은 문자열을 표준 출력으로 한번에(bulk) 작성

-> 리스트 r의 모든 문자열 요소를 하나로 합친 후(줄바꿈 포함) 표준 출력으로 한번에 작성

+) print()보다 입출력 속도가 빠름