https://www.acmicpc.net/problem/1439
문제 요약
0과 1로만 이루어진 문자열 s가 있습니다. s에서 연속된 하나이상의 숫자를 잡고 모두 뒤집을 수 있습니다.
s = 0001100 일 때.
1. 전체를 뒤집으면 1110011이 됩니다.
2. 4번째 문자부터 5번째 문자까지 문자를 뒤집으면 한 번에 0000000이 되어서 1번의 횟수로도 모두 같은 숫자를 만들 수있습니다.
s를 최소한으로 뒤집어서 같은 숫자로 만들 수 있는 횟수를 구해야합니다.
문제 풀이
1. 0을 뒤집는 경우와 1을 뒤집는 경우의 횟 수를 비교해야 하기 때문에 2번 반복문 돌립니다.
2. 문자열 길이 만큼 반복문을 돌려, 뒤집어야 하는 숫자가 나왔고, 그 숫자가 끝날때 ( 묶음 별로 세기 위함 ) 횟수를 증가시킵니다.
3. 이전 회차와 비교하여 더 작은 횟수를 저장하여 출력합니다.
주의할 점
횟수를 셀 때 더 작은 쪽으로 저장하게 해야 하고, 0또는 1을 전부 세는 것이 아닌 묶음 별로 세도록 조건을 주는것이 중요합니다.
코드
#include<iostream>
using namespace std;
string s;
int sum = 0, cnt = 0;
int main()
{
cin >> s;
//0을 뒤집는 경우와 1을 뒤집는 경우의 횟수를 봐야하기 때문에 2번 반복
for (int i = 0; i < 2; i++)
{
// 횟수 체크 변수
sum = cnt;
cnt = 0;
for (int j = 0; j < s.length(); j++)
{
if (s[j] != i+'0')
{
// 체크 하는 숫자가 끝날때 cnt 증가
if (s[j + 1] == NULL || s[j + 1] == i + '0')
{
cnt++;
}
}
}
// 0의 경우와 1의 경우 더 작은쪽 저장
if (cnt <= sum)
{
sum = cnt;
}
}
cout << sum;
return 0;
}
반응형
예제1
0001100
결과1
예제2
11111
결과2
예제3
00000001
결과3
예제4
11001100110011000001
결과4
예제5
11101101
결과5
'BAEKJOON > Greedy' 카테고리의 다른 글
C++ / 1541 / 잃어버린 괄호 ( 그리디 알고리즘 ) (0) | 2025.01.04 |
---|---|
C++ / 2839 / 설탕 배달 ( 그리디 알고리즘 ) (0) | 2024.11.07 |
C++ / 1715 / 카드 정렬하기 ( 그리디 알고리즘 ) (0) | 2024.10.30 |
C++ / 10162 / 전자레인지 ( 그리디 알고리즘 ) (0) | 2024.10.29 |
C++ / 1789 / 수 들의 합 ( 그리디 알고리즘 ) (0) | 2024.10.28 |