오늘은 두가지 정답을 준비했다.
첫번째는 죽었다 깨어나도 정규식은 못 외우겠다는 사람을 위한 것이고 두번째는 정규식을 이용하는 것이다.
정규식은 분명 굉장히 유용하지만IDE도 못 쓰고 검색도 못하는 대부분의 코딩 테스트 특성상 정말 재수가 없게도 이런 문제를 만난다면 내 기억력에만 의존해야하며 점 하나까지 신경 써야하는 정규식보다 조금 돌아가는 길이 나을 수도 있다.
물론 이 문제를 푸는데 필요한 정규식은 굉장히 쉽기 때문에 '이 문제만 생각하면' 정규식을 외우는 게 더 편하다.
잘 모르겠어서 검색은 했는데 스스로 풀고 싶은 사람이라면 정답을 보기 전에 subString이나 indexOf를 활용해서 푸는 것을 시도해보자.
10분동안 생각해봤는데 모르겠으면 밑으로.
BufferedReader || Scanner
StringBuilder || OuputStreamWriter || System.out.print || StringTokenizer
이런 것들은 제한 시간이 굉장히 빡빡한 경우를 제외하면 취향이니 크게 신경 쓸 필요 없다
1. 정규식 버전
import java.io.*;
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder result = new StringBuilder();
int T = Integer.parseInt(br.readLine());
String[] inputPattern = br.readLine().split("\\*"); // 패턴을 입력 받아 *을 기준으로 나눈다
String[] fileNames = new String[T];
String pattern = "^" + inputPattern[0] + ".*" + inputPattern[1] + "$"; // 정규식 완성
for (int i=0; i<T; i++) {
fileNames[i] = br.readLine(); // 검사할 문자열들을 입력받음
}
for (String s : fileNames) {
if (Pattern.matches(pattern, s) && s.length() != 1) {
result.append("DA").append("\n");
} else {
result.append("NE").append("\n");
}
}
System.out.println(result);
}
}
크게 설명할 것은 없다.
length가 1인 경우를 제외해주지 않으면 a*a 정규식에 a가 들어갔을 때 DA가 출력되는 불상사가 발생한다.
사실 정규식을 더 구체적으로 작성해서 글자수까지 제한을 해주면 그만이긴 한데, 나는 이게 더 편하다.
2. 정규식 사용하지 않는 버전
import java.util.*;
import java.io.*;
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder result = new StringBuilder();
int T = Integer.parseInt(br.readLine()); // 입력받을 파일명 개수
String[] inputPattern = br.readLine().split("\\*");
String[] fileNames = new String[T];
for (int i=0; i<T; i++) {
fileNames[i] = br.readLine();
}
for (String s : fileNames) {
if (s.indexOf(inputPattern[0])==0 &&
s.lastIndexOf(inputPattern[1])==s.length()-inputPattern[1].length() &&
inputPattern[0].length() + inputPattern[1].length() -1 <= s.length()) {
result.append("DA").append("\n");
} else {
result.append("NE").append("\n");
}
}
System.out.println(result);
}
}
예외가 더 많아져서 조건문이 조금 더 복잡해졌고 정규식을 사용하지 않기 때문에 패턴이 빠졌다.
패턴으로 들어오는 문자열이 "a*b"이런 식으로 단순하면 정규식 버전하고 차이가 없는데, "aa*bbb"같은 형태로 여러 글자가 들어오는 순간 인덱스를 조금 더 신경써줘야 한다.
크게 어려운 건 아니라서 남이 작성한 코드 보고 이해하는 것보다 방법만 이해했다면 직접 작성하는 게 더 쉽게 느껴질 것이다.
'CS ﹒ Algorithm > Baekjoon' 카테고리의 다른 글
Java 백준 문제풀이(28) 24479: 알고리즘 수업 - 깊이 우선 탐색1 (+24480 깊이 우선 탐색2) (0) | 2022.07.27 |
---|---|
JAVA 백준 문제풀이(27) 10828:스택, 19258:큐2 (0) | 2022.07.26 |
JAVA 백준 문제풀이 (25) 2309: 일곱 난쟁이 (0) | 2022.07.22 |
JAVA 백준 문제풀이 (24) 11047: 동전 0 (0) | 2022.07.20 |
JAVA 백준 문제풀이 (23) 10989 : 수 정렬하기3 (0) | 2022.07.19 |