반응형
문제
해당 문제는 '이것이 취업을 위한 코딩 테스트다 with 파이썬' 교재의 chapter11.03 문자열 뒤집기 문제와 같다.
풀이
package greedy;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException{
//뒤집기
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = br.readLine();
int cnt0 = 0;// 전부 0으로 바꾸는 경우
int cnt1 = 0;// 전부 1로 바꾸는 경우
int prev = s.charAt(0) - '0';
// 첫 번째 원소에 대해서 처리
if(prev == 0) {
cnt0 = 1;
}else {
cnt1 = 1;
}
// 두 번째 원소부터 모든 원소를 확인하며
for(int i = 0; i < s.length(); i++) {
int ch = s.charAt(i) - '0';
if(ch != prev) {
if(ch == 0) {
// 다음 수에서 0으로 바뀌는 경우
cnt0++;
}else {
// 다음 수에서 1로 바뀌는 경우
cnt1++;
}
prev = ch;
}
}
System.out.println(Math.min(cnt0, cnt1));
br.close();
}
}
팁
ex) s = 0001100인 경우
1. 첫 번째 원소 처리하기
- 첫 번째 원소가 0이면 cnt0을 1로, 아니면 cnt1을 1로 설정한다.
if(prev == 0) {
cnt0 = 1;
}else {
cnt1 = 1;
}
2. 두 번째 원소 ~ 마지막 원소까지 처리하기
- 두 번째 원소부터 모든 수를 확인하며, 앞의 수와 비교해봤을 때 바뀐 경우 0인지 1인지 구분하여 카운트해준다.
for(int i = 0; i < s.length(); i++) {
int ch = s.charAt(i) - '0';
if(ch != prev) {
if(ch == 0) {
// 다음 수에서 0으로 바뀌는 경우
cnt0++;
}else {
// 다음 수에서 1로 바뀌는 경우
cnt1++;
}
prev = ch;
}
}
3. 최소 횟수 구하기
- cnt0과 cnt1중에서 작은 수를 출력한다.
System.out.println(Math.min(cnt0, cnt1));
출처
1439번: 뒤집기
다솜이는 0과 1로만 이루어진 문자열 S를 가지고 있다. 다솜이는 이 문자열 S에 있는 모든 숫자를 전부 같게 만들려고 한다. 다솜이가 할 수 있는 행동은 S에서 연속된 하나 이상의 숫자를 잡고 모
www.acmicpc.net
반응형
'알고리즘 > Java' 카테고리의 다른 글
[백준] 18406.럭키 스트레이트(Java8) (0) | 2021.10.10 |
---|---|
[백준] 10162.전자레인지(Java8) (0) | 2021.10.08 |
[백준] 1946.신입 사원(Java8) (0) | 2021.10.06 |
[백준] 2217.로프(Java8) (0) | 2021.10.04 |
[백준] 11047.동전 0(Java8) (0) | 2021.10.04 |