숫자의 이진 표현을 다루다 보면, 해당 수 안에 연속된 1이 몇 개 있는지 확인해야 하는 경우가 종종 발생합니다. 예를 들어 비트 연산 최적화나 데이터 분석 작업에서 유용하게 활용될 수 있는데요. 이 글에서는 파이썬으로 이진 문자열에서 연속된 1의 최대 길이를 구하는 두 가지 방법을 예제 코드와 함께 소개합니다.
방법 1: split()과 map() 함수 활용
파이썬의 split() 함수는 주어진 문자열을 특정 구분자를 기준으로 여러 개의 문자열로 나누는 기능을 합니다. 여기서는 0을 구분자로 사용해 문자열을 자른 뒤, 각 조각의 길이를 map() 함수로 계산하고 그중 최댓값을 구하는 방식입니다.
예제 코드
data = '11110000111110000011111010101010101011111111'
def Max_len_cons_1(data):
print("연속된 1의 최대 개수:", max(map(len, data.split('0'))))
Max_len_cons_1(data)실행 결과
위 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다.
연속된 1의 최대 개수: 8
문자열을 0을 기준으로 나누면 '1111', '11111', '11111' 등 1로만 이루어진 조각들이 생성되고, 이 중 가장 긴 조각의 길이인 8이 출력됩니다.
방법 2: 정규표현식(regular expression) 활용
두 번째 방법은 파이썬의 re 모듈을 사용하는 것입니다. 정규표현식 패턴 1+는 "하나 이상의 연속된 1"을 의미합니다. findall()로 이 패턴에 일치하는 모든 블록을 추출한 후, 그중 가장 긴 블록의 길이를 구하면 됩니다.
예제 코드
import re
data = '11110000111110010011'
the_ones = re.findall(r"1+", data)
print("1로 이루어진 블록:", the_ones)
print("연속된 1의 최대 개수 =", len(max(the_ones, key=len)))실행 결과
위 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다.
1로 이루어진 블록: ['1111', '11111', '1', '11'] 연속된 1의 최대 개수 = 5
정리
두 방법 모두 간결하고 직관적이라 상황에 따라 편하게 선택해 사용할 수 있습니다.
- split + map 방식: 추가 모듈 없이 기본 함수만으로 해결할 수 있어 코드가 매우 짧고 단순합니다.
- 정규표현식 방식: 연속된 1의 블록 자체를 리스트로 확인할 수 있어, 최대 길이뿐 아니라 블록의 개수나 분포까지 함께 분석할 때 유용합니다.
단순히 최대 길이만 필요하다면 첫 번째 방법이, 블록 단위의 세부 정보가 필요하다면 두 번째 방법이 더 적합합니다.