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


요약
- 잠수함의 소리가 두 종류의 단위 소리의 연속으로 이루어져 있고, 그 단위 소리를 각각 0과 1로 표시합니다.
- 한 특정한 소리의 반복은 ~로 표시합니다.
- (x|y)는 x 또는 y 중에서 아무거나 하나만을 선택해서 만든 소리의 집합을 의미합니다.
- 우리가 식별하고자 하는 잠수함의 엔진소리의 패턴은 아래와 같습니다.
- 입력으로 0과 1로 구성된 스트링이 주어질 때, 해당 스트링이 앞에서 나온 잠수함의 엔진소리인지 판별하는 문제입니다.
- 입력: 첫 번째 줄에 길이가 150개 이하로 제한된 0과 1로 구성된 스트링 1개가 입력됩니다.
- 출력: 첫 번째 줄에 입력에 들어있는 스트링이 잠수함의 엔진소리를 나타내는 스트링이면 "SUBMARINE"을 출력하고 그렇지 않으면 "NOISE"를 출력합니다.
3. 소스코드
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class Main {
public String isSubmarine(String input) {
String pattern = "^(100+1+|01)+$";
return input.matches(pattern) ? "SUBMARINE" : "NOISE";
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
String input = br.readLine();
br.close();
Main m = new Main();
bw.write(m.isSubmarine(input) + "\n");
bw.flush();
bw.close();
}
}
4. 접근
- 해당 문제는 정규 표현식을 이용하여 판별할 수 있는 문제입니다.
- 주어진 패턴을 정규 표현식을 이용하여 표현한 후에 해당 표현식을 이용하여 주어진 문자열이 해당 패턴에 맞는지 확인하면 되는 문제입니다.
- 주어진 패턴 (100~1~|01)~ 을 정규 표현식으로 나타내면 ^(100+1+|01)+$ 가 됩니다.
- ^는 정규식의 시작을 의미합니다.
- +는 앞의 문자가 하나 이상 있는 것을 의미합니다.
- |는 패턴 안에서 or 연산을 의미합니다.
- $는 정규식의 끝을 의미합니다.
- 입력으로 주어진 스트링을 변수 input에 저장합니다.
- (100~1~|01)~을 정규 표현식으로 변경하여 변수 pattern에 저장합니다.
- matches()를 이용하여 변수 input에 있는 값이 주어진 패턴과 맞는지 변수 pattern과 비교하여 만약 패턴과 맞다면 SUBMARINE을 출력하고 그렇지 않다면 NOISE를 출력합니다.