복대가리의 개발

[C#] 백준 (알고리즘)/실버 문제

[백준 - C#] 1439번 뒤집기

복대가리 2022. 7. 25. 23:36
728x90

문제링크

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

 

1439번: 뒤집기

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

www.acmicpc.net

 

문제

다솜이는 0과 1로만 이루어진 문자열 S를 가지고 있다. 다솜이는 이 문자열 S에 있는 모든 숫자를 전부 같게 만들려고 한다. 다솜이가 할 수 있는 행동은 S에서 연속된 하나 이상의 숫자를 잡고 모두 뒤집는 것이다. 뒤집는 것은 1을 0으로, 0을 1로 바꾸는 것을 의미한다.
예를 들어 S=0001100 일 때,
전체를 뒤집으면 1110011이 된다.4번째 문자부터 5번째 문자까지 뒤집으면 1111111이 되어서 2번 만에 모두 같은 숫자로 만들 수 있다.
하지만, 처음부터 4번째 문자부터 5번째 문자까지 문자를 뒤집으면 한 번에 0000000이 되어서 1번 만에 모두 같은 숫자로 만들 수 있다.
문자열 S가 주어졌을 때, 다솜이가 해야하는 행동의 최소 횟수를 출력하시오.

조건

시간제한 : 2초
메모리 제한 : 128 MB

입력

첫째 줄에 문자열 S가 주어진다. S의 길이는 100만보다 작다.

 

출력

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

 

문제정리

이번 문제의 경우 입력 받은 0과 1의 숫자를 0이나 1로 모든 숫자를 같에 만드는 문제입니다.

저는 0과 1로 만들 때 연속된 숫자의 개수가 적은 것이 행동의 최소 횟수라고 판단이되어

숫자가 바뀌는 순간마다 카운팅하고 둘중 Min값을 구하여 통과하였습니다.

 

첫번째 숫자와 다음 숫자를 비교하기 위해 첫번재 숫자는 바로 카운팅 하였고, 반복문은 1부터 시작하였습니다.

현재 숫자와 하나전 숫자를 비교하여 숫자의 연속성이 끊킨다면 개수를 늘려주고 반복문이 다 끝나면 두 수의 카운팅 개수를 비교하여 Min값을 출력 하였습니다.

C# 코드

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
32
33
34
static void Main(string[] args)
{
    // 1439
    StreamWriter writer = new StreamWriter(OpenStandardOutput());
    StreamReader reader = new StreamReader(OpenStandardInput());
 
    string S = reader.ReadLine();
    int zeroCount = 0// 0이 연속되는 숫자
    int oneCount = 0// 1이 연속되는 숫자
 
    // 첫번째 숫자 카운팅
    if (S[0== '0')
        zeroCount++;
    else
        oneCount++;
 
    for (int i = 1; i < S.Length; i++)
    {
        // 현재 숫자랑 전숫자랑 비교해서 값이 달라지면 연속이 끊킨거라고 판단하여 개수 증가
        if (S[i] != S[i - 1])
        {
            if (S[i] == '0')
                zeroCount++;
            else
                oneCount++;
        }
    }
 
    // 두 숫자 카운팅 중 작은숫자가 최소 횟수로 보고 출력
    writer.WriteLine(MathF.Min(zeroCount, oneCount));
 
    writer.Close();
    reader.Close();
}
cs

읽어주셔서 감사합니다 오늘도 즐거운 하루 되세요.

 

728x90