연속된 하나 이상의 숫자를 뒤집어서 모든 값을 통일한다
문자열 S={0001100}에서 S[0]==S[1]
S[1]==S[2]
S[2]!=S[3]
S[3]==S[4]
S[4]!=S[5]
S[5]==S[6]
S[0]부터S[2]의 값, S[5]부터 S[6]의 값이 0으로 같고, S[3]부터 S[4]의 값이 1로 같다
따라서 S[3]부터 S[4]의 값을 1번 뒤집는 것이 최소로 뒤집는 횟수이다
문제에서 나온 다른 예시들도 위의 과정처럼 하나씩 생각하다가
최소로 뒤집는 횟수의 규칙을 발견했는데
값이 다른 횟수/2를 올림한 것이 최소로 뒤집는 횟수이다
using System;
using System.Collections.Generic;
using System.Linq;
namespace _1439
{
class Program
{
static void Main()
{
// 특정 수로 통일시키기 위해서, 0을 1로 바꾸거나 1을 0으로 바꿔야한다.
// 연속된 하나 이상의 숫자를 모두 뒤집는 것이 가능하므로
// 연속된 숫자가 k개 있을 경우 k개를 한번에 뒤집는 것이 optimal solution이다.
// 1이 연속되는 부분이 몇 개 있는지, 0이 연속되는 부분이 몇 개 있는지 확인한 다음 둘 중 가장 적은 것을 택하는 것이 답이 된다.
var str = Console.ReadLine();
var arr = Array.ConvertAll(str.ToArray().Select(x => x.ToString()).ToArray(), int.Parse);
//int[] arr2 = new int[2];
//여기부터 작성하세요
double difCount = 0;
double flipCount = 0;
for(int i = 0; i < str.Length-1; i++)
{
if (str[i] != str[i + 1])
difCount++;
}
flipCount = Math.Ceiling(difCount/2);
Console.WriteLine(flipCount);
}
}
}
참고
https://yaraba.tistory.com/115
C# 반올림, 올림, 버림 사용하기
C# 에서는 System.Math를 통해서 다양한 수학 함수를 제공하고 있습니다. 그중에서도 자주 사용하는 반올림 연관 함수를 정리해 놓습니다. 기본적인 사용 형태는 다음과 같습니다.반올림 Math.Round(값
yaraba.tistory.com
https://learn.microsoft.com/ko-kr/dotnet/api/system.math.ceiling?view=net-7.0
Math.Ceiling 메서드 (System)
지정된 수보다 크거나 같은 최소 정수 값을 반환합니다.
learn.microsoft.com
https://www.acmicpc.net/problem/1439
1439번: 뒤집기
다솜이는 0과 1로만 이루어진 문자열 S를 가지고 있다. 다솜이는 이 문자열 S에 있는 모든 숫자를 전부 같게 만들려고 한다. 다솜이가 할 수 있는 행동은 S에서 연속된 하나 이상의 숫자를 잡고 모
www.acmicpc.net
'코딩 테스트 > BOJ' 카테고리의 다른 글
C# 2979 트럭 주차 (0) | 2023.01.19 |
---|---|
C# 10808 알파벳 개수 (0) | 2023.01.19 |
C# 5585 거스름돈 (0) | 2023.01.18 |
C# 1874 스택 수열 (0) | 2023.01.18 |
C# 11659 구간 합 구하기4 (1) | 2023.01.17 |