>백엔드 개발 >C++ >이진 문자열에서 모든 0을 제거하는 데 필요한 인접하지 않은 쌍 뒤집기의 최소 횟수

이진 문자열에서 모든 0을 제거하는 데 필요한 인접하지 않은 쌍 뒤집기의 최소 횟수

WBOY
WBOY앞으로
2023-09-04 13:09:06724검색

이진 문자열에서 모든 0을 제거하는 데 필요한 인접하지 않은 쌍 뒤집기의 최소 횟수

이진 문자열에서 인접한 비트 쌍을 뒤집으면 문자열에서 단일 0을 쉽게 제거할 수 있습니다. 그러나 이진 문자열에서 모든 0을 제거해야 할 경우 인접하지 않은 비트 쌍을 뒤집어야 할 수도 있습니다. 이 기사에서는 이진 문자열에서 모든 0을 제거하는 데 필요한 인접하지 않은 쌍 뒤집기의 최소 횟수를 결정하는 방법에 대해 설명합니다.

알고리즘

이 문제를 해결하기 위해 간단한 탐욕 알고리즘을 사용하겠습니다. 아이디어는 항상 서로 가장 멀리 떨어져 있고 그 사이에 적어도 하나의 0이 있는 비트 쌍을 선택하는 것입니다. 그런 다음 이 두 비트를 뒤집어 문자열에서 0을 효과적으로 제거할 수 있습니다. 모든 0이 제거될 때까지 이 과정을 반복합니다.

이제 이 알고리즘을 C++로 구현해 보겠습니다.

으아아아

출력

으아아아

코드 설명

위 코드는 이진 문자열을 입력으로 사용하고 문자열에서 모든 0을 제거하는 데 필요한 인접하지 않은 쌍 뒤집기의 최소 수를 계산합니다. 이제 코드를 자세히 살펴보겠습니다.

먼저 바이너리 문자열을 입력으로 받아 문자열 변수 "s"에 저장합니다. 또한 문자열의 크기를 정수 변수 "n"에 저장합니다.

으아아아

다음으로 문자열에 0의 개수를 저장하기 위해 변수 "cnt"를 초기화합니다. 그런 다음 for 루프를 사용하여 문자열을 반복합니다. 0이 발생할 때마다 0의 개수를 늘리고 다음 두 비트도 0인지 확인합니다. 그렇다면 인덱스를 2만큼 늘려 비트 쌍을 뒤집습니다. 그렇지 않으면 인덱스를 1씩 늘려 인접한 비트 쌍만 뒤집습니다.

으아아아

마지막으로 문자열에서 모든 0을 제거하는 데 필요한 인접하지 않은 쌍 뒤집기 횟수를 출력합니다.

으아아아

테스트 케이스 예시

이진 문자열 "100101000"을 고려해 보겠습니다. 이 문자열에서 모든 0을 제거하는 데 필요한 인접하지 않은 쌍 뒤집기의 최소 횟수는 위의 알고리즘을 사용하여 계산할 수 있습니다.

먼저 위치 2에서 0을 만납니다. (1,3) 쌍을 뒤집어 문자열 "110101000"을 얻습니다. 그런 다음 위치 5에서 다음 0을 만납니다. (1,7) 쌍을 뒤집어 문자열 "111101000"을 얻습니다. 그런 다음 위치 8에서 다음 0을 만납니다. (1,9) 쌍을 뒤집어 문자열 "111111000"을 얻습니다. 이제 문자열에서 모든 0이 제거되었습니다.

문자열에서 0을 모두 제거하는 데 필요한 인접하지 않은 쌍 뒤집기 횟수는 3입니다. 입력 문자열 "100101000"에 대해 위의 C++ 코드를 실행하여 이를 확인할 수 있습니다.

결론

이 문서에서는 이진 문자열에서 모든 0을 제거하는 데 필요한 인접하지 않은 쌍 뒤집기의 최소 수를 결정하는 방법에 대해 논의했습니다. 우리는 이 문제를 해결하기 위해 간단한 탐욕 알고리즘을 사용하고 이를 C++ 코드로 구현합니다. 또한 알고리즘 작동 방식을 설명하기 위해 예제 테스트 사례도 제공합니다.

위 내용은 이진 문자열에서 모든 0을 제거하는 데 필요한 인접하지 않은 쌍 뒤집기의 최소 횟수의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 tutorialspoint.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제