문제
다솜이는 0과 1로만 이루어진 문자열 S를 가지고 있다. 다솜이는 이 문자열 S에 있는 모든 숫자를 전부 같게 만들려고 한다. 다솜이가 할 수 있는 행동은 S에서 연속된 하나 이상의 숫자를 잡고 모두 뒤집는 것이다. 뒤집는 것은 1을 0으로, 0을 1로 바꾸는 것을 의미한다.
예를 들어 S=0001100 일 때,
- 전체를 뒤집으면 1110011이 된다.
- 4번째 문자부터 5번째 문자까지 뒤집으면 1111111이 되어서 2번 만에 모두 같은 숫자로 만들 수 있다.
하지만, 처음부터 4번째 문자부터 5번째 문자까지 문자를 뒤집으면 한 번에 0000000이 되어서 1번 만에 모두 같은 숫자로 만들 수 있다.
문자열 S가 주어졌을 때, 다솜이가 해야하는 행동의 최소 횟수를 출력하시오.
입력
첫째 줄에 문자열 S가 주어진다. S의 길이는 100만보다 작다.
출력
첫째 줄에 다솜이가 해야하는 행동의 최소 횟수를 출력한다.
예제 입력
0001100
예제 출력
1
문제 접근
최적해를 찾는 간단한 그리디 알고리즘이다.
인접한 같은 숫자들은 한번에 뒤집을 수 있으므로 하나의 숫자와 같이 취급할 수 있다.
ex) 0001100 -> 010
여기에 규칙성을 찾으면 쉽게 풀 수 있다.
문자열 | 뒤집는 횟수 | length |
0 / 1 | 0 | 1 |
01 | 1 | 2 |
010 | 1 | 3 |
0101 | 2 | 4 |
01010 | 2 | 5 |
010101 | 3 | 6 |
0101010 | 3 | 7 |
따라서 숫자가 변화하는 구간만 카운트로 체크하고 이러한 규칙으로 계산해서 출력하면 된다.
정답 코드
//백준 1439번: 수 찾기
//입력
const s = require('fs').readFileSync('/dev/stdin').toString().trim();
let count = 0;
for(let i=0; i<s.length-1; i++){ // -1을 하지 않으면 s[i+1] 마지막 인덱스에서 undefined
if(s[i] != s[i+1]) count += 1;
}
console.log(Math.floor((count+1)/2))
'알고리즘 > 백준' 카테고리의 다른 글
[백준 알고리즘] 3273번: 두 수의 합 (Python / 파이썬) (0) | 2024.01.09 |
---|---|
[백준 알고리즘] 14502번: 연구소 (Python / 파이썬) (1) | 2024.01.09 |
[백준 알고리즘] 1920번: 수 찾기 (JavaScript / JS / 자바스크립트) (0) | 2023.06.17 |
[백준 알고리즘] 11399번: ATM (JavaScript / JS / 자바스크립트) (1) | 2023.06.10 |
[백준 알고리즘] 1158번: 요세푸스 문제 (JavaScript / JS / 자바스크립트) (0) | 2023.06.02 |