카테고리 없음

[백준] 잠수함 식별 2671 : Java

nagrang 2026. 1. 17. 18:41

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번 이상 반복 됨