1 분 소요

1. 문제

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

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

예를 들어 S=0001100  ,

전체를 뒤집으면 1110011 된다.
4번째 문자부터 5번째 문자까지 뒤집으면
1111111 되어서 2 만에 모두 같은 숫자로 만들  있다.
하지만, 처음부터 4번째 문자부터 5번째 문자까지 문자를 뒤집으면
 번에 0000000 되어서 1 만에 모두 같은 숫자로 만들  있다.

문자열 S가 주어졌을 , 다솜이가 해야하는 행동의 최소 횟수를 출력하시오.

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

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

// 예제 입력 1
0001100

// 예제 출력 1
1

// 예제 입력 2
11111

// 예제 출력 2
0

// 예제 입력 3
00000001

// 예제 출력 3
1

// 예제 입력 4
11001100110011000001

// 예제 출력 4
4

// 예제 입력 5
11101101

// 예제 출력 5
2


2. 핵심 아이디어

  • 문자열에 있는 숫자를 모두 0 혹은 1로 만들어야 함
  • 문자열 S의 길이는 100만 이하이므로, 시간 복잡도는 O(N)에 해결해야 함
  • 다음 두 가지 경우를 모두 계산
    • 모두 0으로 만드는 경우
    • 모두 1로 만드는 경우


3. Python 문제풀이

# 방법 1
import sys
input = sys.stdin.readline

data = input().rstrip()
count0 = 0
count1 = 0

if data[0] == '1' :
  count0 += 1
else :
  count1 += 1

for i in range(len(data) - 1) :
  if data[i] != data[i + 1] :
    if data[i + 1] == '1' :
      count0 += 1
    else :
      count1 += 1

print(min(count0, count1))

# 방법 2
import sys
input = sys.stdin.readline

data, count = input().rstrip(), 0

for i in range(1, len(data)) :
  if data[i] != data[i-1] :
    count += 1

print((count + 1) // 2)


4. Java 문제풀이

import java.util.Scanner;

public class Main {
  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    String d = sc.next();
    char[] data = d.toCharArray();
    int count0 = 0, count1 = 0;

    if (data[0] == '1') {
      count0++;
    } else {
      count1++;
    }

    for (int i=0; i<data.length-1; i++) {
      if (data[i] != data[i+1]) {
        if (data[i+1] == '1') {
          count0++;
        }
        else {
          count1++;
        }
      }
    }
    System.out.println(Math.min(count0,count1));
  }
}

댓글남기기