728x90
반응형
SMALL
백준 1439 뒤집기 풀이 정리
문제
다솜이는 0과 1로만 이루어진 문자열 S를 가지고 있다. 다솜이는 이 문자열 S에 있는 모든 숫자를 전부 같게 만들려고 한다. 다솜이가 할 수 있는 행동은 S에서 연속된 하나 이상의 숫자를 잡고 모두 뒤집는 것이다. 뒤집는 것은 1을 0으로, 0을 1로 바꾸는 것을 의미한다.
예를 들어 S=0001100 일 때,
- 전체를 뒤집으면 1110011이 된다.
- 4번째 문자부터 5번째 문자까지 뒤집으면 1111111이 되어서 2번 만에 모두 같은 숫자로 만들 수 있다.
하지만, 처음부터 4번째 문자부터 5번째 문자까지 문자를 뒤집으면 한 번에 0000000이 되어서 1번 만에 모두 같은 숫자로 만들 수 있다.
문자열 S가 주어졌을 때, 다솜이가 해야하는 행동의 최소 횟수를 출력하시오.
첫째 줄에 문자열 S가 주어진다. S의 길이는 100만보다 작다.
입력
0001100
첫째 줄에 다솜이가 해야하는 행동의 최소 횟수를 출력한다.
출력
1
풀이
문자열에서 0의 묶음 갯수와 1의 묶음 갯수를 세서 더 작은 것을 뒤집으면 됨
아래와 같은 순서로 풀이
1. 문자열의 i번째와 i + 1번째가 다른지 비교
2. 다를때, i번째 문자가 0이면 zero_cnt++(연속된 0의 묶음 갯수), 1이면 one_cnt++(연속된 1의 묶음 갯수)
3. 둘 중 더 작은 수 리턴
전체 코드
더보기
#include <iostream>
#include <string>
using namespace std;
string s;
// 연속된 0의 묶음의 갯수
int zero_cnt;
// 연속된 1의 묶음의 갯수
int one_cnt;
int reverse(void) {
for (int i = 0; i < s.size(); i++) {
// i번째와 i+1번째가 다른지 비교
if (s[i] != s[i + 1]) {
// 0이면 0의 묶음 갯수 ++
if (s[i] == '0') {
zero_cnt++;
}
// 1이면 1의묶음 갯수 ++
else {
one_cnt++;
}
}
}
// 둘중 작은 값 리턴
return min(zero_cnt, one_cnt);
}
int main(void) {
cin >> s;
cout << reverse() << endl;
return 0;
}
728x90
반응형
LIST
'Algorithm' 카테고리의 다른 글
[BAEKJOON] 3190 뱀 (0) | 2023.08.17 |
---|---|
[BAEKJOON] 18406 럭키 스트레이트 (0) | 2023.08.14 |
[BAEKJOON] 7576 토마토 (0) | 2023.08.10 |
[BAEKJOON] 14888 연산자 끼워넣기 (0) | 2023.08.03 |
[Programmers] 괄호 변환 (0) | 2023.08.02 |