Algorithm

[BAEKJOON] 1439 뒤집기

0so0 2023. 8. 14. 19:00
728x90
반응형
SMALL

백준 1439 뒤집기 풀이 정리

 

1439 뒤집기

문제 

다솜이는 0과 1로만 이루어진 문자열 S를 가지고 있다. 다솜이는 이 문자열 S에 있는 모든 숫자를 전부 같게 만들려고 한다. 다솜이가 할 수 있는 행동은 S에서 연속된 하나 이상의 숫자를 잡고 모두 뒤집는 것이다. 뒤집는 것은 1을 0으로, 0을 1로 바꾸는 것을 의미한다.

예를 들어 S=0001100 일 때,

  1. 전체를 뒤집으면 1110011이 된다.
  2. 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