본문 바로가기
백준/그리디

백준 1439 c++ "뒤집기" -PlusUltraCode-

by PlusUltraCode 2025. 9. 16.

https://www.acmicpc.net/problem/1439

 

[필자 사고]

0의 갯수와 1의 갯수를 구한다음 최소값을 출력하면 되는 문제였다.

조심해야 될 점은 특정 숫자가 처음부터 0인경우는 조심하자.

 

아래는 자세한 코드 해설이다.

[코드 해설]

getCountNumber 함수

  • 매개변수: int num (찾고자 하는 숫자, 0 또는 1)
  • 반환값: 문자열 number 안에서 num이 연속된 구간으로 등장하는 개수

동작 과정

  1. 초기화
    • count = 0 : num이 등장한 구간의 개수를 셉니다.
    • flag = false : 현재 위치가 num 구간 안에 있는지 여부를 표시합니다.
  2. 문자열 순회
    • 문자열 number의 각 문자를 순회하며 검사합니다.
    • 현재 구간 안일 때 (flag == true)
      • 만약 지금 문자가 num이 아니면, 구간이 끝났다고 판단하고 flag = false로 바꿉니다.
    • 현재 구간 밖일 때 (flag == false)
      • 만약 지금 문자가 num이면, 새로운 구간이 시작된 것이므로 flag = true로 바꾸고 count++ 합니다.
  3. 반환
    • 모든 문자열을 확인한 뒤, 최종적으로 구한 count를 반환합니다.
    • 즉, num이 연속해서 나타나는 구간의 개수를 의미합니다.

main 함수

  1. 입력
    • cin >> number;
    • 0과 1로 이루어진 문자열을 입력받습니다.
  2. 구간 개수 세기
    • zeroCount = getCountNumber(0) : 0으로 이루어진 구간의 개수
    • oneCount = getCountNumber(1) : 1으로 이루어진 구간의 개수
  3. 예외 처리
    • 만약 zeroCount == 0 또는 oneCount == 0라면, 문자열 전체가 한 종류(모두 0 또는 모두 1)입니다.
    • 이 경우 뒤집을 필요가 없으므로 0을 출력하고 종료합니다.
  4. 최소 뒤집기 횟수 계산
    • 0 구간을 모두 뒤집거나, 1 구간을 모두 뒤집으면 문자열이 통일됩니다.
    • 따라서 최소 횟수는 min(zeroCount, oneCount)입니다.
  5. 출력
    • 계산된 최소 뒤집기 횟수를 출력합니다.

[소스 코드]

#include <iostream>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;

string number;

int getCountNumber(int num) {

	int count = 0;
	bool flag = false;
	for (int i = 0; i < number.size(); i++) {
		
		if (flag == true) {
			if (number[i] - '0' != num) {
				flag = false;
			}
		}

		else {
			if (number[i] - '0' == num) {
				flag = true;
				count++;
			}
		}
		
	}

	return count;
}

int main(void) {
	cin >> number;
	int zeroCount = getCountNumber(0);
	int oneCount = getCountNumber(1);

	if (zeroCount == 0||oneCount==0) {
		cout << 0; 
		return 0;
	}

	cout << min(zeroCount, oneCount);
}