1. 문제
https://www.acmicpc.net/problem/2671

문제 유형 : 문자열
목표 : 문자열이 주어진 규칙을 만족하는지 확인하기
2. 접근
문제 이해부터 다소 시간이 걸렸다. 표기에 대한 규칙을 쭉 설명한다. 그래서 결국 이 모든 규칙을 만족하는지 찾으라는건가? 했는데 알고보니 하나의 규칙과 일치하는지 찾으면 되는 것이였다.
(100~1~|01)~
이런 규칙으로, 해석해보면
10으로 시작하고 0이 1개 이상 오고, 1이 1개 이상오는 문자열
이거나
01로 이루어진 문자열이
한 번 이상 반복되는 문자열인지 확인하라는 것이다.
나는 prefix(10, 01)가 주어졌으니 그냥 구현하면 되지 않을까? 하고 구현에 시작했다가 결국 못풀었다.
생각보다 고려해야하는 것이 많았다. 1001 다음에 바로 01이 오는 경우 등 규칙이 딱 떨어지지가 않았다. 그리고 인덱스 범위 체크하는 것이 더 까다로웠다.
'01' 를 만나면 idx+=2를 했는데 밑에서는 idx, idx+1를 사용해서 idx가 마지막 인덱스인지, 마지막 두 번째 인덱스인지에 따라 결과가 달라 예외처리를 해야했다. 이게 계속 고려하다 보니깐 코드가 복잡해졌다.
결국 포기하고 정규표현식을 사용하기로 했다. 내가 코테에서 과연 정규표현식을 사용할 수 있을까..? 그래도 쓰면 무조건 유리하니 공부를 해보자.
3. 정규표현식을 사용해서 풀기
public class Main {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
public static void main(String[] args) throws IOException {
String s = br.readLine();
String pattern = "(100+1+|01)+";
if (s.matches(pattern)) {
System.out.println("SUBMARINE");
} else {
System.out.println("NOISE");
}
}
}
정말 짧다.
- 1+ : 1이 1번 이상 반복 됨
- (...)+: 이 전체 덩어리가 1번 이상 반복 됨