μ•Œκ³ λ¦¬μ¦˜/λ°±μ€€

[ λ°±μ€€ / BOJ 2671 ] μž μˆ˜ν•¨ 식별 ( μžλ°” / JAVA )

KIMHYEYUN 2021. 11. 10. 20:23
λ°˜μ‘ν˜•

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

 

2671번: μž μˆ˜ν•¨μ‹λ³„

μž…λ ₯에 λ“€μ–΄μžˆλŠ” μŠ€νŠΈλ§μ„ 읽고, 이것이 μž μˆ˜ν•¨μ˜ μ—”μ§„μ†Œλ¦¬λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μŠ€νŠΈλ§μΈμ§€ μ•„λ‹ˆλ©΄ κ·Έλƒ₯ λ¬Όμ†μ˜ μž‘μŒμΈμ§€λ₯Ό νŒμ •ν•œ ν›„, μž μˆ˜ν•¨μ˜ μ—”μ§„ μ†Œλ¦¬μ— ν•΄λ‹Ήν•˜λŠ” 슀트링이면 "SUBMARINE"을 좜λ ₯ν•˜κ³ 

www.acmicpc.net

 

문제


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

μš°λ¦¬λŠ” λ¬Όμ†μ—μ„œ λ“€λ¦¬λŠ” μ†Œλ¦¬μ˜ νŒ¨ν„΄μ„ λ“£κ³ μ„œ κ·Έ μ†Œλ¦¬κ°€ νŠΉμ •ν•œ μž μˆ˜ν•¨μ—μ„œ λ‚˜μ˜€λŠ” μ†Œλ¦¬μΈμ§€ μ•„λ‹Œμ§€λ₯Ό μ•Œμ•„λ‚΄λ €κ³  ν•œλ‹€. 이 λ¬Έμ œμ—μ„œλŠ” μž μˆ˜ν•¨μ˜ μ†Œλ¦¬κ°€ 두 μ’…λ₯˜μ˜ λ‹¨μœ„ μ†Œλ¦¬μ˜ μ—°μ†μœΌλ‘œ 이루어져 있고, κ·Έ λ‹¨μœ„ μ†Œλ¦¬λ₯Ό 각각 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둜 κ΅¬μ„±λœ 슀트링이 μ£Όμ–΄μ§ˆ λ•Œ, 이 슀트링이 μ•žμ—μ„œ 기술된 μž μˆ˜ν•¨μ˜ μ—”μ§„μ†Œλ¦¬μΈμ§€ μ•„λ‹Œμ§€λ₯Ό νŒλ³„ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜λΌ.

μž…λ ₯


0κ³Ό 1둜 κ΅¬μ„±λœ 슀트링이 1개 λ“€μ–΄μžˆλ‹€. μ΄λ•Œ 각 슀트링의 κΈΈμ΄λŠ” 150개 μ΄ν•˜λ‘œ μ œν•œλœλ‹€.

 

좜λ ₯


μž…λ ₯에 λ“€μ–΄μžˆλŠ” μŠ€νŠΈλ§μ„ 읽고, 이것이 μž μˆ˜ν•¨μ˜ μ—”μ§„μ†Œλ¦¬λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μŠ€νŠΈλ§μΈμ§€ μ•„λ‹ˆλ©΄ κ·Έλƒ₯ λ¬Όμ†μ˜ μž‘μŒμΈμ§€λ₯Ό νŒμ •ν•œ ν›„, μž μˆ˜ν•¨μ˜ μ—”μ§„ μ†Œλ¦¬μ— ν•΄λ‹Ήν•˜λŠ” 슀트링이면 "SUBMARINE"을 좜λ ₯ν•˜κ³ , κ·Έλ ‡μ§€ μ•ŠμœΌλ©΄ "NOISE"λ₯Ό 좜λ ₯ν•œλ‹€.

풀이


μ²˜μŒμ—λŠ” 문제 이해 잘λͺ»......😭

μ•„λ‰˜.... λͺ¨λ“  경우의 μ •κ·œν‘œν˜„μ„ μ“°λž€κ±΄κ°€ ‼️ μ΄λ†ˆλ“€~ ν–ˆλŠ”λ° μ•„λ‹ˆμ–΄μ”€ ν—€ν—€

 

"(100~1~|01)~" 이 μ •κ·œμ‹μ— λ§žλŠ” μ†Œλ¦¬λ§Œ 찾으면 됌~!

 

String regexp = "^(100+1+|01)+"

둜 λ„μœΌνŠΈ ‼️

μ½”λ“œ


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.regex.Pattern;
/* 
    μ •κ·œν‘œν˜„μ‹ μ‚¬μš©
*/
public class Main_BOJ_2671_μž μˆ˜ν•¨μ‹λ³„{
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String noise = "NOISE";
        String submarine = "SUBMARINE";
        // (100~1~|01)~
        String regexp = "^(100+1+|01)+";
        String str = br.readLine();

        boolean flag = Pattern.matches(regexp, str);
        if(flag)
            System.out.println(submarine);
        else
            System.out.println(noise);


    }
}

 

728x90
λ°˜μ‘ν˜•