본문 바로가기
백준

[백준, Java] 2671번, 잠수함식별 알고리즘 분류(문자열)

by 열정적인 이찬형 2023. 6. 1.

주의사항

  • JAVA를 사용하여 프로그램을 사용하였습니다.
  • 백준에서 코드를 작성하였을 때 아래 형태에서 Main에서 결과가 출력되어야 합니다.
public class Main{ 	
	public static void main(String[] args){
    }
}

문제 설명


접근 방법

이 문제에 핵심

1. 모든 소리를 나타내는 0과 1 그리고 (), ~, | 으로 표현할 수 있습니다. 

2. 잠수함의 소리는 (100~1~ | 01) ~ 인 소리의 집합입니다.

3. 소리의 스트링이 주어질 때 잠수함의 소리인지 확인한 뒤 결과를 출력합니다.

 

알고리즘 진행 순서.

 

1. 입력된 정보를 저장합니다.

 

2. 주어진 스트링이 잠수함 소리인지 확인합니다.

 

3. 확인한 결과를 출력합니다.

 

잠수함의 소리

 

 (100~1~ | 01) ~

 

:{1001, 01, 0101, 10001 ......}

 

잠수함의 소리는 항상!!!

 (100~1~ | 01) ~

1001

시작해야 한다.

 

 (100~1~ | 01) ~

10으로 시작했을 때

0이 1번 이상 반복된 이후 1이 1번 이상 반복되어야 한다.

 

주의점!!

 

아래와 같이 스트링이 주어지면 잠수함의 소리이다!!10011001

 

※저는 이 부분을 간과하고 문제를 풀다보니까 시간이 좀 걸렸습니다.

→이 부분을 처리하기 위해서 1이 1번 이상 반복될 때 다음에 2개에 인덱스를 먼저 탐색하여 0이 연속으로 오는지 확인했습니다.

 

이 과정에 벗어나면 항상 잠수함의 소리가 아니다!!

 

 
 

예제입력 2.

1. 입력된 정보를 저장합니다.

 

스트링 : 100000000001101

 

2. 주어진 스트링이 잠수함 소리인지 확인합니다.

 

10으로 시작!!

 

100000000001101

 

0이 1번 이상 반복!

 

100000000001101

 

1이 1번 이상 반복!

 

100000000001101

 

01으로 시작!!

 

100000000001101

 

 

3. 확인한 결과를 출력합니다.

 

모두 잠수함의 규칙대로 진행되었습니다.

SUBMARINE을 결과로 출력합니다.

 

  • BufferedReader를 사용하여 입력되는 정보를 저장합니다.
  • 스트링이 0110으로 시작하는 기준으로 잠수함의 소리가 맞는지 탐색합니다.
  • 10으로 시작한 경우 01번 이상 반복된 후 11번 이상 반복되는지 확인합니다.
  • 잠수함 소리 규칙에 맞지 않으면 NOISE, 맞으면 SUBMARINEBufferedWriter에 저장합니다.
  • BufferedWriter에 저장된 결과를 출력합니다.

 

결과코드

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class Main {
    public static void main(String[] args) throws IOException {
        //입력값 처리하는 BufferedReader
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        //결과값 출력하는 BufferedWriter
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        char[] code = br.readLine().toCharArray();
        //(100~1~ | 01)~ : 잠수함 소리 패턴
        boolean flag = false;	//'10'으로 시작되었을 때 확인 Flag
        boolean soundCheck = true; //잠수함 소리 확인 변수
        int i = 0;	//스트링 Index 변수
        //스트링이 잠수함 소리인지 비교
        while(i<code.length) {
            //시작점이 01, 10인지 확인
            if (!flag) {
                //'10'인지 확인
                if (code[i] == '1') {
                    //'11'이면 잠수함 소리 X
                    if (i + 1 >= code.length || code[i + 1] == '1') {
                        soundCheck = false;
                        break;
                    }
                    //'10'으로 시작되었을 때 0과 1이 반복되어야 하기 때문에 flag 변경
                    flag = true;
                }
                //'01'인지 확인
                else {
                    //'00'이면 잠수함 소리 X
                    if (i + 1 >= code.length || code[i + 1] == '0') {
                        soundCheck = false;
                        break;
                    }
                }
                i += 2;
            }
            //'10'으로 시작되어서 1과 0이 반복되는 것 탐색
            else {
                //'0'이 1번이라도 반복되는지 확인하는 Boolean
                boolean check = false;
                //'0'이 반복되는 것 탐색
                while (i < code.length) {
                    if (code[i] == '1')
                        break;
                    check = true;
                    i++;
                }
                //스트링의 끝이면 1이 더 나올 수 없으므로 잠수함 소리 X
                if (i >= code.length || !check) {
                    soundCheck = false;
                    break;
                }
              	//'1'이 1번이라도 반복되는지 확인하는 Boolean
                check = false;
                //'0'이 반복되는 것 탐색
                while (i < code.length) {
                    if (code[i] == '0')
                        break;

                    //'1'이후에 '00'이 반복되면 새로운 '10'을 시작으로 본다.
                    if(check && i + 1 < code.length && i + 2 < code.length && code[i+1] == '0' && code[i+2] == '0')
                        break;
                    check = true;
                    i++;
                }
                flag = false;
            }
        }
        //잠수함의 소리이면
        if(soundCheck)
            bw.write("SUBMARINE");
        else	//잠수함의 소리가 아니면
            bw.write("NOISE");
        bw.flush();		//결과 출력
        bw.close();
        br.close();
    }
}

댓글