πŸ“– [λ°±μ€€μ•Œκ³ λ¦¬μ¦˜ 풀이] Q.2671 μž μˆ˜ν•¨ 식별 문제 풀이 - java

πŸ“– 문제

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

일반적으둜 μž μˆ˜ν•¨ 엔진이 μž‘λ™ν•  λ•Œμ— λ‚˜μ˜€λŠ” μ†Œλ¦¬λŠ” μž μˆ˜ν•¨μ˜ μ’…λ₯˜μ— λ”°λΌμ„œ λ‹€λ₯΄λ‹€κ³  ν•œλ‹€.

μš°λ¦¬λŠ” λ¬Όμ†μ—μ„œ λ“€λ¦¬λŠ” μ†Œλ¦¬μ˜ νŒ¨ν„΄μ„ λ“£κ³ μ„œ κ·Έ μ†Œλ¦¬κ°€ νŠΉμ •ν•œ μž μˆ˜ν•¨μ—μ„œ λ‚˜μ˜€λŠ” μ†Œλ¦¬μΈμ§€ μ•„λ‹Œμ§€λ₯Ό μ•Œμ•„λ‚΄λ €κ³  ν•œλ‹€.

이 λ¬Έμ œμ—μ„œλŠ” μž μˆ˜ν•¨μ˜ μ†Œλ¦¬κ°€ 두 μ’…λ₯˜μ˜ λ‹¨μœ„ μ†Œλ¦¬μ˜ μ—°μ†μœΌλ‘œ 이루어져 있고, κ·Έ λ‹¨μœ„ μ†Œλ¦¬λ₯Ό 각각 0κ³Ό 1둜 ν‘œμ‹œν•œλ‹€.

또, ν•œ νŠΉμ •ν•œ μ†Œλ¦¬μ˜ λ°˜λ³΅μ€ ~둜 ν‘œμ‹œν•œλ‹€. 예λ₯Ό λ“€μ–΄ x~λŠ” xκ°€ ν•œλ²ˆ 이상 λ°˜λ³΅λ˜λŠ” λͺ¨λ“  μ†Œλ¦¬μ˜ 집합을 λ§ν•˜κ³ ,

(xyz)~λŠ” κ΄„ν˜Έ μ•ˆμ— μžˆλŠ” xyz둜 ν‘œν˜„λœ μ†Œλ¦¬κ°€ ν•œλ²ˆ 이상 λ°˜λ³΅λ˜λŠ” λͺ¨λ“  μ†Œλ¦¬μ˜ 집합을 λ§ν•œλ‹€. λ‹€μŒμ˜ 예λ₯Ό 보라.

1~ = {1, 11, 111, 1111, ..., 1...1, ...}
(01)~ = {01, 0101, 010101, 01010101. ...}
(1001)~ = {1001, 10011001, ..., 100110011001...1001, ...}
10~11 = {1011, 10011, 100011, ..., 1000...011, ...}
(10~1)~ = {101, 1001, 10001, 100001, ...1011001, ...100110110001101, ...}
​그리고 (x y)λŠ” xλ˜λŠ” yμ€‘μ—μ„œ μ•„λ¬΄κ±°λ‚˜ ν•˜λ‚˜λ§Œμ„ μ„ νƒν•΄μ„œ λ§Œλ“  μ†Œλ¦¬μ˜ 집합, 즉 집합{x, y}λ₯Ό μ˜λ―Έν•œλ‹€.
예λ₯Ό λ“€λ©΄(1001 0101)은 μ§‘ν•©μœΌλ‘œ {1001, 0101}을 μ˜λ―Έν•œλ‹€. λ”°λΌμ„œ (0 1)~은 0κ³Ό 1둜 이루어진 λͺ¨λ“  슀트링의 집합, 즉 λͺ¨λ“  μ†Œλ¦¬μ˜ 집합을 λ§ν•œλ‹€.
또 ν•œ 예λ₯Ό 보면 (100 11)~은 100κ³Ό 11을 λ§ˆμŒλŒ€λ‘œ μ„žμ–΄μ„œ λ§Œλ“€ 수 μžˆλŠ” λͺ¨λ“  μ†Œλ¦¬μ˜ 집합을 μ˜λ―Έν•œλ‹€.
즉 (100 11)~에 ν•΄λ‹Ήν•˜λŠ” μŠ€νŠΈλ§μ„ μ§‘ν•©μœΌλ‘œ λ‚˜νƒ€λ‚΄λ©΄ {100, 11, 10011, 100100100, 1110011, …}이 λœλ‹€.

μš°λ¦¬κ°€ μ‹λ³„ν•˜κ³ μž ν•˜λŠ” μž μˆ˜ν•¨μ˜ μ—”μ§„μ†Œλ¦¬μ˜ νŒ¨ν„΄μ€ λ‹€μŒκ³Ό κ°™λ‹€. (100~1~|01)~

여기에 μ†ν•˜λŠ” μ†Œλ¦¬μ˜ 예λ₯Ό 듀어보면, 1001, 01, 100001, 010101, 1000001110101, 1001110101, 0101010101, 10010110000001111101, 01010101011000111, 10000111001111, …이닀.

λ‹€μ‹œ λ§ν•΄μ„œ 이것은 100~1~κ³Ό 01을 μž„μ˜λ‘œ μ„žμ–΄μ„œ λ§Œλ“€ 수 μžˆλŠ” λͺ¨λ“  슀트링의 집합을 λ‚˜νƒ€λ‚Έλ‹€.

μž…λ ₯으둜 0κ³Ό 1둜 κ΅¬μ„±λœ 슀트링이 μ£Όμ–΄μ§ˆ λ•Œ, 이 슀트링이 μ•žμ—μ„œ 기술된 μž μˆ˜ν•¨μ˜ μ—”μ§„μ†Œλ¦¬μΈμ§€ μ•„λ‹Œμ§€λ₯Ό νŒλ³„ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜λΌ.

πŸ” 접근법

Q.2671 μž μˆ˜ν•¨ 식별 λ¬Έμ œμž…λ‹ˆλ‹€.

λ¬Έμ œκ°€ μƒλ‹Ήνžˆ κΈΈκ³  μ΄λŸ°μ €λŸ° 쑰건듀이 λ§Žμ•„λ³΄μ΄μ§€λ§Œ

λͺ¨λ‘ 예λ₯Ό λ“€κΈ° μœ„ν•œ μ„€λͺ…이고

문제λ₯Ό 잘 읽어보면 κ²°κ΅­ λ¬Έμ œμ—μ„œ ꡬ해야할

κ²½μš°λŠ” (100~1~|01)~ μž…λ‹ˆλ‹€.

λ¬Έμ œμ—μ„œ 주어진 μ˜ˆμ‹œλ“€μ„ μ‚΄νŽ΄λ³΄λ©΄ μ •κ·œν‘œν˜„μ‹κ³Ό μΌμΉ˜ν•˜λ―€λ‘œ

μ •κ·œν‘œν˜„μ‹μ„ μ΄μš©ν•΄ 풀이가 κ°€λŠ₯ν•©λ‹ˆλ‹€.

String regex = "^(100+1+|01)+$" 

λ₯Ό μ΄μš©ν•΄ νŒ¨ν„΄μ— λ§žλŠ”λ‹€λ©΄ SUBMARINE을 λ§žμ§€ μ•ŠλŠ”λ‹€λ©΄ NOISEλ₯Ό 좜λ ₯ν•΄μ£Όλ©΄ λμž…λ‹ˆλ‹€.

πŸ’» μ½”λ“œ

package problem.string.regex;

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

public class Main_2671 {

    static String str;

    public static void main(String[] args) throws IOException {
        input();
        String answer = solve(str);
        System.out.println(answer);
    }

    public static void input() throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        str = br.readLine();
        br.close();
    }

    public static String solve(String input) {
        StringBuilder sb = new StringBuilder();
        String regex = "^(100+1+|01)+$";
        if(Pattern.matches(regex,input) == true){
            sb.append("SUBMARINE");
        }
        else
            sb.append("NOISE");

        return sb.toString();
    }
}
Written on March 31, 2021