Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python으로 문자열 내 연속 숫자의 최대 곱 구하기

Python은 데이터를 다룰 수 있는 강력한 라이브러리들을 다수 제공합니다. 프로그래밍을 하다 보면 긴 문자열 안에서 인접한 두 숫자의 곱 중 가장 큰 값을 찾아야 하는 경우가 종종 발생합니다. 예를 들어 '5238521'이라는 문자열이 주어졌을 때, 인접한 숫자 쌍들의 곱(5×2, 2×3, 3×8, 8×5, 5×2, 2×1) 중 최댓값인 40을 구하는 식입니다.

이 글에서는 이러한 문제를 해결하는 두 가지 대표적인 방법을 소개합니다.

방법 1: zip()과 max() 조합

가장 직관적인 방법입니다. 먼저 문자열을 리스트로 변환한 뒤, 슬라이싱을 활용해 연속된 요소들을 짝지어 줍니다. zip(Astring, Astring[1:])은 원본 리스트와 한 칸씩 앞당긴 리스트를 묶어 인접 요소 쌍을 생성하며, 언패킹 연산자를 통해 각 쌍의 숫자를 곱한 후 max()로 그중 최댓값을 구합니다.

예제 코드

Astring = '5238521'
# 주어진 문자열
print("Given String : ", Astring)
# 문자열을 리스트로 변환
Astring = list(Astring)
print("String converted to list:\n", Astring)
# max() 사용
res = max(int(a) * int(b) for a, b in zip(Astring, Astring[1:]))
# 결과 출력
print("The maximum consecutive product is : ", res)

실행 결과

Given String : 5238521
String converted to list:
['5', '2', '3', '8', '5', '2', '1']
The maximum consecutive product is : 40

방법 2: map()과 max() 조합

두 번째 방법은 함수형 프로그래밍 스타일에 가깝습니다. map() 함수를 사용해 연속된 정수 쌍을 지속적으로 생성하고, operator 모듈의 mul 함수로 각 쌍의 숫자를 곱합니다. 마지막으로 max() 함수를 적용해 결과값 중 최댓값을 얻습니다.

예제 코드

from operator import mul
Astring = '5238521'
# 주어진 문자열
print("Given String : ", Astring)
# 문자열을 리스트로 변환
Astring = list(Astring)
print("String converted to list:\n", Astring)
# max()와 map(), mul() 사용
res = max(map(mul, map(int, Astring), map(int, Astring[1:])))
# 결과 출력
print("The maximum consecutive product is : ", res)

실행 결과

Given String : 5238521
String converted to list:
['5', '2', '3', '8', '5', '2', '1']
The maximum consecutive product is : 40

마무리

두 방법 모두 동일한 결과를 반환하지만 성격이 조금 다릅니다. zip 방식은 제너레이터 표현식과 함께 사용되어 가독성이 뛰어나고 로직이 명확하게 드러나는 반면, map 방식mul 같은 연산자 함수를 재사용해 코드가 더 간결합니다. 데이터 처리 상황과 개인적인 코딩 스타일에 따라 적절한 방법을 선택하면 됩니다.