728x90
문제 1439번
1439번: 뒤집기
다솜이는 0과 1로만 이루어진 문자열 S를 가지고 있다. 다솜이는 이 문자열 S에 있는 모든 숫자를 전부 같게 만들려고 한다. 다솜이가 할 수 있는 행동은 S에서 연속된 하나 이상의 숫자를 잡고 모
www.acmicpc.net
[ 문제 풀이 ]
연속된 하나 이상의 숫자를 잡고 모두 뒤집는 것이므로 0끼리, 1끼리 묶었을 때 더 적은 묶음의 개수를 찾으면 됩니다. 여러가지 간단한 방법들도 많지만, dfs로 탐색과 StringTokenizer 방법 2가지로 각각 풀어보았습니다.
[ 코드 ]
1) DFS 탐색
문자열을 순회하며 0을 만났을 때와 1을 만났을 때, 각각 res1, res2를 증가시키고 dfs()를 돌려 0의 묶음과 1의 묶음의 개수를 카운트해줍니다. 이 때, visit[]으로 각 인덱스의 방문 여부를 체크하여 중복 방문을 하지 않도록 해줍니다.
import java.io.*;
public class Main {
private static String s;
private static boolean[] visit;
private static char[] arr;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
s = br.readLine();
arr = new char[s.length()];
visit = new boolean[s.length()];
int res1 = 0;
int res2 = 0;
for (int i = 0; i < s.length(); i++) {
arr[i] = s.charAt(i);
}
for (int i = 0; i < arr.length; i++) {
if (visit[i]) continue;
if (arr[i] == '0') {
dfs(i);
res1++;
} else {
dfs(i);
res2++;
}
}
bw.write(String.valueOf(Math.min(res1, res2)));
bw.flush();
}
private static void dfs(int n) {
if (n == s.length()-1) return;
visit[n] = true;
if (arr[n+1] == arr[n]) {
dfs(n+1);
}
}
}
위의 코드로 실행한 결과입니다.

2) StringTokenizer 이용
import java.io.*;
import java.util.StringTokenizer;
public class Main {
private static String s;
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 s = br.readLine();
StringTokenizer st1 = new StringTokenizer(s, "0");
StringTokenizer st2 = new StringTokenizer(s, "1");
bw.write(String.valueOf(Math.min(st1.countTokens(), st2.countTokens())));
bw.flush();
}
}
위의 코드로 실행한 결과입니다. DFS 탐색을 활용한 방법보다는 살짝 느린 것을 확인할 수 있습니다.

728x90
'Algorithm > Baekjoon' 카테고리의 다른 글
[Baekjoon] 백준 1240번: 노드 사이의 거리 (JAVA) (0) | 2023.10.26 |
---|---|
[Baekjoon] 백준 2910번: 빈도 정렬 (JAVA) (0) | 2023.10.26 |
[Baekjoon] 백준 2234번: 성곽 (JAVA) (1) | 2023.10.21 |
[Baekjoon] 백준 1388번: 바닥장식 (JAVA) (1) | 2023.10.20 |
[Baekjoon] 백준 13417번: 카드 문자열 (JAVA) (0) | 2023.10.18 |