여늘(yeonuel) 2023. 10. 23. 11:06

https://www.acmicpc.net/problem/20365

 

20365번: 블로그2

neighbor 블로그를 운영하는 일우는 매일 아침 풀고 싶은 문제를 미리 정해놓고 글을 올린다. 그리고 매일 밤 각각의 문제에 대하여, 해결한 경우 파란색, 해결하지 못한 경우 빨간색으로 칠한

www.acmicpc.net

 

 

1. 문제 설명

 

이때, 모든 문제를 원하는 색으로 칠할 때까지 필요한 작업 횟수의 최솟값을 출력하라

위 예시의 정답은 1~7번 문제를 파란색, 3번을 빨간색, 5번을 빨간색, 8번을 빨간색으로 순서대로 칠한다면 작업 횟수는 4번이다.

 

 

2. 접근법

 

처음에는 가장 많이 색을 칠해야 하는 것을 한번에 칠하고 그 이후에 각 문제를 하나씩 색칠해 가는 방식으로 풀었음

하지만, 문제 요구 사항 중 하나는 "연속된 임의의 문제를 선택하여 색칠한다"임

 

즉, 연속된 문제들을 한번에 색칠한다는 것을 생각하며 풀어나가야함

 

위 문제는 그리디로 풀 수 있음

가장 많이 칠해야 색깔을 구한뒤 해당 범위를 모두 그 색으로 색칠한 뒤

다른 색으로 색칠해야하는 부분들을 색칠해 나가면됨

 

 

 

3. 설계

 

- 연속된 부분을 하나로 간주하여 각 색깔을 몇번 색칠해야 하는지 구함

- 그 중에서 가장 많이 색칠해야하는 부분은 한번에 색칠

- 나머지 부분을 차례로 색칠해나감

 

 

4. 코드

 

import java.util.*;
import java.io.*;



public class Main {



    public static void main(String args[]) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        String line = br.readLine();

        int b = 0;
        int r = 0;

        if (line.charAt(0) == 'B') {
            b += 1;
        } else if (line.charAt(0) == 'R') {
            r += 1;
        }

        for (int i=1; i<n; i++) {
            if (line.charAt(i-1) != line.charAt(i)) {
                if (line.charAt(i) == 'B') {
                    b += 1;
                } else {
                    r += 1;
                }
            }
        }

        System.out.println(Math.min(b, r) + 1);

    }
}