- 코드
정답 코드 : 정규식을 통하여 정규식에 맞으면 StringBuilder에 append시켜준 뒤 반복문을 빠져나와서 출력해주었다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String args[]) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.valueOf(st.nextToken());
StringBuilder sb = new StringBuilder();
String s = "((100+1+)|(01))+";
for(int i = 0; i < N; i++) {
String temp = br.readLine();
if(temp.matches(s))
sb.append("YES");
else
sb.append("NO");
sb.append("\n");
}
System.out.print(sb);
}
}
다른 사람 코드 : maivve.tistory.com/208를 보고 참고하였다. 정규식을 사용하는 것보다 오토마타 전이 그래프(DFA) 를 직접 그려보는 것 + 오토마타 상태 그래프를 바탕으로 알고리즘을 짜서 코딩하는 것이 더 빠르다고 한다. 링크를 통해서 한번 익혀보면 좋을 것 같다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Algorithm {
static StringBuilder sb;
public static void main(String args[]) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.valueOf(st.nextToken());
sb = new StringBuilder();
while (n-- > 0) {
String jeonPa = br.readLine();
int state = 0;
for (int i = 0; i < jeonPa.length(); i++) {
char num = jeonPa.charAt(i);
state = getState(state, num);
if (state == -1) {
break;
}
}
if (state == 0 || state == 3 || state == 6 || state == 7) {
sb.append("YES");
} else {
sb.append("NO");
}
sb.append("\n");
}
System.out.print(sb.toString());
}
// 오토마타 상태 그래프에 맞게 출력
static int getState(int state, char ch) {
if (ch == '0') {
switch (state) {
case 0:
return 1;
case 2:
return 4;
case 3:
return 1;
case 4:
return 5;
case 5:
return 5;
case 6:
return 1;
case 7:
return 8;
case 8:
return 5;
}
}
if (ch == '1') {
switch (state) {
case 0:
return 2;
case 1:
return 3;
case 3:
return 2;
case 5:
return 6;
case 6:
return 7;
case 7:
return 7;
case 8:
return 0;
}
}
return -1;
}
}
'algorithm' 카테고리의 다른 글
[JAVA] 백준 1701번 : Cubeditor (0) | 2020.10.12 |
---|---|
[JAVA] 백준 11054번 : 가장 긴 바이토닉 부분 수열 (0) | 2020.10.11 |
[JAVA] 백준 11048번 : 이동하기 (0) | 2020.10.09 |
[JAVA] 백준 17070번 : 파이프 옮기기 1 (0) | 2020.10.07 |
[JAVA] 백준 11051번 : 이항 계수 2 (0) | 2020.10.06 |