https://www.acmicpc.net/problem/9342
코드설명
정규표현식(Regular Expression) + 문자열(String) 을 활용합니다.
정규표현식을 활용할경우 짧은 코드로 풀 수 있습니다.
이번에 정규표현식을 작성하며 처음에 틀렸었던 패턴입니다.
먼저 잘못된 정규표현식입니다.
String regExPattern = "^[ABCDEF]*[A]+[F]+[C]+[ABCDEF]$";
이 부분이 잘못된 이유는 ABCDEF가 시작점이라는 것은 잘 표현했지만, 0번 또는 1번 반복된다는 '?' 키워드를 사용했어야했습니다. 위의 [ABCDEF]* 는 ABCDEF 중 1개의 단어가 0번부터 N번 반복가능하다라는 의미입니다. 문제에서는 0개 또는 1개로 강제한 상황이니 '?' 를 사용했어야 합니다.
그래서 이를 아래와 같이 개선했습니다.
String regExPattern = "^[ABCDEF]?[A]+[F]+[C]+[ABCDEF]?$";
이번에는 로직에 전혀 문제가 없습니다만, 마음에 들지 않은 부분은 언제 '[]' 대괄호를 사용하는지입니다.
일반적으로 대괄호는 여러개의 단어 중 1개를 사용할때 사용합니다.
그러므로 아래와 같이 작성하면 더 깔끔합니다.
String regExPattern = "^[ABCDEF]?A+F+C+[ABCDEF]?$";
여기서 '+' 는 1개 또는 N개 이상입니다.
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.util.regex.Pattern;
public class Main {
static int N, M, S, P, A, B, X, L, R, C, n, k, m, l, K, D, T;
static int answer = 0;
static StringBuilder sb = new StringBuilder();
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
// String regExPattern = "^[ABCDEF]?[A]+[F]+[C]+[ABCDEF]?$";
String regExPattern = "^[ABCDEF]?A+F+C+[ABCDEF]?$";
for(int i=0; i<N; i++) {
if(Pattern.matches(regExPattern, br.readLine()) == true) {
System.out.println("Infected!");
}else {
System.out.println("Good");
}
}
}
}
'알고리즘 > String' 카테고리의 다른 글
[백준] 14713 앵무새 - 큐(Queue) + 문자열(String) JAVA (0) | 2024.10.12 |
---|---|
[백준] 3613 Java vs C++ - 문자열(String) + 파싱(Parsing) + 정규표현식(RegExp) JAVA (0) | 2024.10.08 |
[백준] 2607 비슷한 단어 - 구현(Implementation) + 문자열(String) JAVA (0) | 2023.08.07 |
[백준] 20920 영단어 암기는 괴로워 - 문자열(String) + 정렬(Sort) + 해시맵(HashMap) JAVA (0) | 2023.08.05 |