Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

개발자되기 프로젝트

[백준] Greedy: 뒤집기 본문

코테준비

[백준] Greedy: 뒤집기

Seung__ 2022. 5. 28. 15:49

문제

다솜이는 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만보다 작다.

출력

첫째 줄에 다솜이가 해야하는 행동의 최소 횟수를 출력한다.

 

문제 접근

뒤집는 행동의 가장 작은 수를 찾아야 한다. 정확한 방법을 반환해야 하는 것이 아니라 횟수만 알면 된다.

즉, 주어진 문자열에서 뒤집어야 할 덩어리(?)의 수를 파악하면  된다.

뒤집는 행위 자체는 다르겠지만, 단순히 행동의 최소 횟수를 파악하기에는 적합한 방법이다.

위와 같이 숫자의 배열을 구분할 수 있다.

여기서 한가지 의문이 생긴다. 0, 1 의 묶음의 개수를 보면 둘 중 하나가 큰 경우가 있다.

행동의 최소 개수를 파악해야 하기 때문에 둘 중 작은 수를 반환하면 된다.

 

하지만 각각을 모두 확인하기에는 귀찮다.

 

마지막 경우를 보자.

111 / 0 / 11 / 0 / 1 로 구분되어 있다.

처음에 제시된 숫자는 1이고, 1과 달라지는 묶음의 개수를 파악하면 2 이다.

 

즉, 처음에 제시된 문자와 다른 문자의 묶음의 수를 파악하면, 뒤집는 행동의 최소 횟수를 확인할 수 있다.

이렇게 하면 반복문 한 번으로 끝낼 수 있음.!

 

package baekjun;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class _1439 {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String numbers = br.readLine();

        //처음 시작 문자 확인.
        char[] numberArr = numbers.toCharArray();
        char start = numberArr[0];

        //배열 돌면서 처음 문자랑 달라지는 경우 cnt 추가
        int cnt = 0;
        char before = start;
        for (char c : numberArr) {
            if (c != start & c != before) {
                cnt++;
            }
            before = c;
        }

        System.out.println(cnt);

    }
}

'코테준비' 카테고리의 다른 글

[백준] Greedy: 캠핑  (0) 2022.05.28
[백준] Greedy: A → B  (0) 2022.05.28
[백준] Greedy: 단어수학  (0) 2022.05.27
[백준] Greedy: 카드 정렬하기  (0) 2022.05.26
[백준] Greedy: 신입사원  (0) 2022.05.23
Comments