[백준] Contact - Java

2025. 4. 29. 16:21·알고리즘

문제 출처

https://www.acmicpc.net/problem/1013

문제

“무한히 넓은 저 우주에 인류만이 홀로 존재한다면, 그건 정말 슬픈 일이 아닐까요”

푸에르토리코 아레시보에 위치한 아레시보 전파망원경(Arecibo radio telescope)은 수십 년째 존재하지 않을 지도 모르는 외계 문명으로부터의 전파를 수신하기 위해 밤하늘을 바라보고 있다.

이 망원경이 수집한 전파 속에서 자연적으로 발생하기 힘든 패턴들을 찾아내어, 그것을 증거로 외계 문명의 존재 여부를 가리려는 노력은 줄곧 이어져왔지만 아직까지도 그러한 패턴은 발견되지 않았다. 한국 천문학계의 자존심 김동혁 박사는 국내 기술로 이러한 탐사를 진행하기 위하여 다음의 전파 표기를 표준으로 삼았다.

전파의 기본 단위는 { 0 , 1 } 두 가지로 구성되어있으며, x+ ( ) 는 임의의 개수(최소 1개) x의 반복으로 이루어진 전파의 집합을 나타낸다.

(xyx)+ ( ) 는 괄호 내의 xyx의 반복으로 이루어진 전파의 집합을 뜻한다. 아래는 이해를 돕기 위한 예제이다.

  • 1+ = { 1, 11, 111, 1111, 11111, … }
  • 10+ = { 10, 100, 1000, 10000, 100000, … }
  • (01)+ = { 01, 0101, 010101, 01010101, 0101010101, … }
  • (1001)+ = { 1001, 10011001, 100110011001, … }
  • 10+11 = { 1011, 10011, 100011, 1000011, 10000011, … }
  • (10+1)+ = { 101, 1001, 10001, 1011001, 1001101, 100011011000001, … }

반복을 의미하는 + 외에도 or 를 의미하는 | 기호가 있다. { x | y } 는 x 혹은 y 를 의미하는 것으로, { 0+ | 1+ } 는 { 0 , 1 , 00 , 11 , 000 , 111 , … } 의 집합을 의미한다. 아래는 두 기호를 복합적으로 사용한 예이다.

  • (100 | 11)+ = { 100 , 11 , 10011 , 11100 , 1110011100 , 100111111100100, … }

최근 김동혁 박사는 아레시보 전파망원경에서 star Vega(직녀성) 으로부터 수신한 전파 기록의 일부를 조사하여 그 전파들의 패턴을 분석하여 아래와 같이 기록하였다.

  • (100+1+ | 01)+

김동혁 박사는 다양한 전파 기록 중에서 위의 패턴을 지니는 전파를 가려내는 프로그램을 필요로 한다. 이를 수행할 수 있는 프로그램을 작성하라.

입력

입력의 첫 줄에는 테스트 케이스의 개수 T가 주어진다. 그 다음 줄부터 각각의 테스트 케이스에 대해 전파를 표현하는, { 0, 1 }만으로 이루어진 문자열이 공백 없이 주어진다. 문자열 길이는 (1 ≤ N ≤ 200)의 범위를 갖는다.

출력

각 테스트 케이스에 대해 주어진 전파가 문제에서 제시한 패턴이면 “YES”를 그렇지 않은 경우는 “NO”를 출력한다. 출력 문자열은 모두 대문자로 구성되어 있다.

예제 입력 1

3
10010111
011000100110001
0110001011001

예제 출력 1

NO
NO
YES

풀이 방법

  • 문제집에서 주제가 2차원 배열이라길래 어떻게 풀지? 했는데 그냥 정규 표현식을 활용하면 되는 문제였다...
  • 사용한 정규 표현식을 해석하면 다음과 같다.
    • (100+1+|01)+
      • 100이 1번이상 반복, 1이 1번 이상 반복되는 문자열이 존재해야한다. 또는 01이라는 패턴이 존재해야한다.
      • 해당 패턴이 사용된 부분이 1회 이상 존재해야한다.
//예제 1번 -> 10010111
1번의 경우, 1001은 100+1+의 조건을 만족하나 0111의 경우는 01뒤에1이 붙어있어
정규표현식을 만족하지 못함. (100+1+)도 만족하지 않으므로 NO가 출력

//예제 2번 -> 011000100110001
2번의 경우, 01 만족, 10001도 만족이나 0011은 (100+1+)이나 (01) 둘중 어느하나도 만족하지 못함

//예제 3번 -> 0110001011001
3번의 경우 01 만족, 10001 만족, 01 만족, 1001 만족이므로 정규 표현식을 통과한다.
  • 따라서 코드에서도 정규식 표현 검사 String을 만들어주고, Pattern 클래스의 matches를 이용하여 검사하면 끝.

풀이 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.regex.Pattern;

public class Main {
    static String REGEXP_PATTERN = "(100+1+|01)+";

    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int T = Integer.parseInt(br.readLine());

        for (int t = 0; t < T; t++) {
            String str = br.readLine();
            boolean check = Pattern.matches(REGEXP_PATTERN, str);

            System.out.println(check ? "YES" : "NO");
        }
    }
}

결과

회고

  • 정규표현식은 외울게 못된..다?
저작자표시 비영리 동일조건 (새창열림)

'알고리즘' 카테고리의 다른 글

[백준] Puyo Puyo - Java  (1) 2025.05.01
[백준] 치킨 배달 - Java  (1) 2025.04.30
[백준] 벽 부수고 이동하기 - Java  (1) 2025.04.24
[백준] 불 - Java  (0) 2025.04.23
[백준] 곱셈 - Java  (1) 2025.04.22
'알고리즘' 카테고리의 다른 글
  • [백준] Puyo Puyo - Java
  • [백준] 치킨 배달 - Java
  • [백준] 벽 부수고 이동하기 - Java
  • [백준] 불 - Java
BGK97
BGK97
사용자 입장에서 한번 더 생각하는 개발자로 성장하고 싶은 사람입니다.
  • BGK97
    꾸준히, 열심히
    BGK97
  • 전체
    오늘
    어제
    • 분류 전체보기 (111)
      • 알고리즘 (73)
      • 컴퓨터 구조와 운영 체제(책) (8)
      • 네트워크 (5)
      • React (10)
      • 경험한 에러들 (3)
      • HTML, CSS, JavaScript (8)
      • 자료구조 (1)
      • 이것이 컴퓨터 과학이다(책) (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
BGK97
[백준] Contact - Java
상단으로

티스토리툴바