이 글에서는 파이썬을 사용하여 이진수 문자열에 K개의 연속된 1이 존재하는지 확인하는 방법을 알아봅니다.
먼저 사용자로부터 1과 0의 조합으로 이루어진 이진수 문자열을 입력받습니다. 그다음 1로만 구성된 새로운 문자열을 생성한 뒤, 원본 문자열 안에 p개의 연속된 1이 존재하는지 검사합니다. 존재하면 "FOUND(찾음)"를 출력하고, 존재하지 않으면 "NOTFOUND(찾지 못함)"를 출력합니다.
예시
이진수 ::1111001111 연속된 1의 개수 입력 :3 연속된 1을 찾았습니다
알고리즘
1단계: 1과 0의 조합으로 된 문자열을 입력받아 변수 X에 저장합니다. p는 이진수에서 찾으려는 연속된 1의 개수입니다.
2단계: p개의 1로 구성된 새로운 문자열을 만듭니다.
newstring = "1" * p
3단계: 문자열 어느 위치에든 p개의 1이 연속해서 나타나는지 확인합니다.
If newstring in X
"FOUND" 출력
Else
"NOT FOUND" 출력
End if예제 코드
# 이진수에 k개의 연속된 1이 있는지 확인하는 함수
def binaryno_ones(n, p):
# k개의 1로 구성된 새로운 문자열 생성
newstr = "1" * p
# 문자열 어느 위치에든 k개의 1이 있는지 확인
if newstr in n:
print("연속된 1을 찾았습니다")
else:
print("연속된 1을 찾지 못했습니다")
# 메인 코드
n = input("이진수를 입력하세요 ::")
p = int(input("연속된 1의 개수를 입력하세요 ::"))
binaryno_ones(n, p)실행 결과
이진수를 입력하세요 ::1111001111 연속된 1의 개수를 입력하세요 ::3 연속된 1을 찾았습니다
코드 설명
핵심 아이디어는 매우 간단합니다. 파이썬의 in 연산자는 부분 문자열 포함 여부를 손쉽게 검사할 수 있습니다. 따라서 "1" * p처럼 문자열 곱셈을 이용해 p개의 1로 이루어진 패턴 문자열을 만든 후, 이 패턴이 입력된 이진수 문자열에 포함되어 있는지만 확인하면 됩니다.
예를 들어 p가 3이면 newstr은 "111"이 되며, "1111001111"에는 "111"이 포함되어 있으므로 연속된 1이 존재한다고 판단할 수 있습니다.
참고로 정규표현식(re 모듈)을 활용하거나, 문자열을 split('0')으로 분리한 뒤 가장 긴 1의 묶음 길이를 구하는 방식으로도 동일한 문제를 해결할 수 있습니다.