문제 설명
다솜이는 0과 1로만 이루어진 문자열 S를 가지고 있다. 이 문자열 S에 있는 모든 숫자를 전부 같게 만들려고 한다.
다솜이가 할 수 있는 행동은 S에서 연속된 하나 이상의 숫자를 잡고 모두 뒤집는 것이다. 뒤집는 것은 1을 0으로, 0을 1로 바꾸는 것을 의미한다.
예를 들어 S = 0001100 일 때,
1. 전체를 뒤집으면 1110011
2. 4번째 문자부터 5번째 문자까지 뒤집으면 111111
이 되어서 두 번 만에 모두 같은 숫자로 뒤집을 수 있다.
하지만 처음부터 4번째 문자부터 5번째 문자까지 문자를 뒤집으면 0000000이 되어서 한 번 만에 모두 같은 숫자로 만들 수 있다.
문자열 S가 주어졌을 때, 다솜이가 해야 하는 행동의 최소 횟수를 출력하세요.
입력조건
- 첫째 줄에 0과 1로만 이루어진 문자열 S
- S의 길이는 100A만보다 작다.
출력조건
- 다솜이가 해야 하는 행동의 최소 횟수 출력
입출력 예시
-
입력예시 출력예시 0001100 1
문제 풀이
- 모든 문자를 0으로 만들었을 때와 모든 문자를 1로 만들었을 때를 구해서 둘 중 더 적은 횟수를 출력한다.
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
String str = br.readLine();
int count0 = 0; //전부 0으로 바꾸는 경우
int count1 = 0; //전부 1로 바꾸는 경우
//첫 번째 원소 처리
if (str.charAt(0) == '0') { //0 -> 1로 바뀌는 경우
count1++;
} else { //1 -> 0으로 바뀌는 경우
count0++;
}
//두 번째 원소부터 확인
for (int i = 0; i < str.length() - 1; i++) {
//앞뒤 원소가 다를 때
if (str.charAt(i) != str.charAt(i + 1)) {
if (str.charAt(i + 1) == '0') { //0 -> 1로 바뀌는 경우
count1++;
} else { //1 -> 으로 바뀌는 경우
count0++;
}
}
}
bw.write(Math.min(count0, count1) + "\n");
bw.flush();
bw.close();
}
}
[참고서적]
이것이 취업을 위한 코딩 테스트다 with 파이썬 by 나동빈
'PS > 이코테' 카테고리의 다른 글
[이코테][Java] 럭키 스트레이트 (1) | 2024.11.19 |
---|---|
[이코테] 구현(Implementation) (1) | 2024.11.18 |
[이코테][Java] 곱하기 혹은 더하기 (0) | 2024.11.12 |
[이코테][Java] 모험가 길드 (2) | 2024.11.12 |
[이코테 ]그리디(Greedy) 알고리즘 (0) | 2024.11.11 |