접근 방법은 다음과 같습니다.
예를들어 0100110101 이라면 1과 0이 뭉쳐있는 부분을 뒤집어야 숫자를 최소한으로 동일하게 만들수 있습니다.
경우에수는 0과 1만 있기 때문에 반복문으로 0과 1이 차지하고 있는 부분을 탐색합니다.
여기서 탐색 방법은 찾고자 하는 target수(변수 i)를 만나면 넘어갑니다. 그러다가 숫자가 변하는 부분이 있으면 그부분은 target수와 반대되는 숫자이며 target수의 영역이 끝나는 부분을 의미합니다.
0과 1모두 같은 방식으로 탐색을 하다가 경계라는 것이 string의 끝도 있기 때문에 각 target수가 끝인지 아닌지 여부까지 탐색을 해주면 영역의 개수를 구할 수 있고 더 작은 영역의 개수를 출력해주면 문제가 풀립니다.
근데 다른분들 풀이보니까 나만 너무 무식하게 풀었네..
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); //선언
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
String s = bf.readLine();
int zero = 0, one = 0;
for (int i = 0; i < 2; i++) {
for (int j = 0; j < s.length(); j++) {
if (Integer.parseInt(String.valueOf(s.charAt(j))) == i) {
if (Character.getNumericValue(s.charAt(j)) == 0 && j == s.length() - 1) {
zero++;
} else if (Character.getNumericValue(s.charAt(j)) == 1 && j == s.length() - 1){
one++;
}
continue;
} else if (j - 1 >= 0 && s.charAt(j - 1) == '0' && s.charAt(j) == '1') {
zero++;
} else if (j - 1 >= 0 && s.charAt(j - 1) == '1' && s.charAt(j) == '0') {
one++;
}
}
}
if (zero > one) {
bw.write(Integer.toString(one));
bw.flush();
bw.close();
} else if (zero < one) {
bw.write(Integer.toString(zero));
bw.flush();
bw.close();
} else {
bw.write(Integer.toString(one));
bw.flush();
bw.close();
}
}
}
'문제풀이' 카테고리의 다른 글
백준 18310번 안테나 JAVA (0) | 2020.09.16 |
---|---|
백준 16234번 인구이동(JAVA) (0) | 2020.09.11 |
카카오 기출 무지의 먹방 라이브 (0) | 2020.09.09 |
프로그래머스 target number (0) | 2020.07.14 |
프로그래머스 네트워크 (0) | 2020.07.14 |