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");
			}
		}
	}
}

+ Recent posts