문제
https://www.acmicpc.net/problem/2671
풀이(50분)
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));
String line = br.readLine();
Pattern pattern = Pattern.compile("(100+1+|01)+");
if(pattern.matcher(line).matches()) {
System.out.println("SUBMARINE");
}else {
System.out.println("NOISE");
}
}
}
문제 풀이 전략
사실 정규 표현식을 자유자재로 쓰지는 못하지만 사용하면 쉽게 풀 수 있다는 것은 알았다. 다만 50분이 걸린 이유는 정규 표현식을 사용하지 않고 해결하고 싶었다.
하지만 50분 고민 뒤에 문제를 정규 표현식으로 제출한 이유는 다음과 같은 반례를 해결하지 못했다.
문제에서 원하는 조건들을 천천히 분기 처리하여 진행했다.
여러 가지 플래그를 두었으며, 1로 시작하는 경우, 0으로 시작하는 경우를 두었다.
또한, 1로 시작했다면 0이 나왔었는지 나왔다면 몇 개 나왔는지, 마지막 1은 나왔는지 등을 두었다.
반례는 다음과 같다. "100011001" 보면 알겠지만 10001이 하나, 1001이 하나로 된다면 조건을 완벽히 만족하여 SUBMARINE가 출력되어야 한다. 하지만 이 문제를 해결하지 못했다.
물론, 시간을 더 두고 문장의 남은 길이 등에 대해 반례를 처리할 수 있었다면 혹은 두 케이스를 나누어 돌렸다면 등의 방법이 존재할 수 있을 것 같다.
'문제 풀이 > 백준' 카테고리의 다른 글
[백준] 1593번. 문자 해독(JAVA) (0) | 2025.03.22 |
---|---|
[백준] 1599번. 민식어(JAVA) (0) | 2025.03.22 |
[백준] 1089번. 스타트링크 타워(JAVA) (0) | 2025.03.20 |
[백준] 1720번. 타일 코드(JAVA) (0) | 2025.03.19 |
[백준] 1241번. 머리 톡톡(JAVA) (0) | 2025.03.18 |