728x90
https://www.acmicpc.net/problem/1439
힌트
더보기
1로 만들기 vs 0으로 만들기 둘 중 최소가 되는 횟수가 최적해이다.
풀이
더보기
모든 수를 1로 만들거나 0으로 만들어야 한다.
어떻게 하면 최소가 될 수 있는지 알 수 있을까?
문제에서 이야기한 전체를 뒤집는 것은 사실 의미 없는 행동이다.
문자열에서 0의 묶음 개수를 x, 1의 묶음 개수를 y라고 할 때 전체를 뒤집으면 x랑 y의 값이 서로 뒤바뀔 뿐이기 때문이다.
그러면 우리는 각 묶음의 개수 중 최소가 바로 정답이 됨을 깨달을 수 있다.
구현의 편의를 위해 erase를 사용하여 중복 문자열을 없애버린 뒤 0과 1이 나타나는 횟수를 각각 세서 그중 최소를 출력하면 된다.
전체 코드
#include <bits/stdc++.h>
using namespace std;
string s;
int one, zero;
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> s;
s.erase(unique(s.begin(), s.end()), s.end());
for (int i = 0; i < s.size(); ++i)
{
if (s[i] == '0')
++zero;
else
++one;
}
cout << min(zero, one);
}
제출 기록
728x90
'백준 > 그리디' 카테고리의 다른 글
[ICPC] 백준 23248 - Treasure Hunter (0) | 2021.10.13 |
---|---|
[ICPC] 백준 11501 - 주식 (0) | 2021.08.12 |
[ICPC] 백준 11497 - 통나무 건너뛰기 (0) | 2021.02.12 |
백준 12845 - 모두의 마블 (0) | 2021.02.08 |
[KOI] 백준 2437 - 저울 (0) | 2021.02.07 |