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

[필자 사고]
0의 갯수와 1의 갯수를 구한다음 최소값을 출력하면 되는 문제였다.
조심해야 될 점은 특정 숫자가 처음부터 0인경우는 조심하자.
아래는 자세한 코드 해설이다.
[코드 해설]
getCountNumber 함수
- 매개변수: int num (찾고자 하는 숫자, 0 또는 1)
- 반환값: 문자열 number 안에서 num이 연속된 구간으로 등장하는 개수
동작 과정
- 초기화
- count = 0 : num이 등장한 구간의 개수를 셉니다.
- flag = false : 현재 위치가 num 구간 안에 있는지 여부를 표시합니다.
- 문자열 순회
- 문자열 number의 각 문자를 순회하며 검사합니다.
- 현재 구간 안일 때 (flag == true)
- 만약 지금 문자가 num이 아니면, 구간이 끝났다고 판단하고 flag = false로 바꿉니다.
- 현재 구간 밖일 때 (flag == false)
- 만약 지금 문자가 num이면, 새로운 구간이 시작된 것이므로 flag = true로 바꾸고 count++ 합니다.
- 반환
- 모든 문자열을 확인한 뒤, 최종적으로 구한 count를 반환합니다.
- 즉, num이 연속해서 나타나는 구간의 개수를 의미합니다.
main 함수
- 입력
- cin >> number;
- 0과 1로 이루어진 문자열을 입력받습니다.
- 구간 개수 세기
- zeroCount = getCountNumber(0) : 0으로 이루어진 구간의 개수
- oneCount = getCountNumber(1) : 1으로 이루어진 구간의 개수
- 예외 처리
- 만약 zeroCount == 0 또는 oneCount == 0라면, 문자열 전체가 한 종류(모두 0 또는 모두 1)입니다.
- 이 경우 뒤집을 필요가 없으므로 0을 출력하고 종료합니다.
- 최소 뒤집기 횟수 계산
- 0 구간을 모두 뒤집거나, 1 구간을 모두 뒤집으면 문자열이 통일됩니다.
- 따라서 최소 횟수는 min(zeroCount, oneCount)입니다.
- 출력
- 계산된 최소 뒤집기 횟수를 출력합니다.
[소스 코드]
#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);
}'백준 > 그리디' 카테고리의 다른 글
| 백준 11497 c++ "통나무 건너뛰기" -PlusUltraCode- (0) | 2025.09.24 |
|---|---|
| 백준 11501 c++ "주식" -PlusUltraCode- (0) | 2025.09.23 |
| 백준 11000 c++ "강의실 배정" -PlusUltraCode- (0) | 2025.06.10 |
| 백준 1105 c++ "팔" -PlusUltraCode- (0) | 2025.05.27 |
| 백준 1082 c++ "방 번호" -PlusUltraCode- (0) | 2025.05.25 |