코딩테스트/백준

[Java] 백준 9432번 - 염색체

곰돌이볼 2023. 3. 15. 13:05

 

  • 조건
    • 염색체의 특정 패턴
      • { A, B, C, D, E, F } 중 0 또는 1개로 시작
      • 다음 문자는 A가 1개 이상 존재해야 함
      • 다음 문자는 F가 1개 이상 존재해야 함
      • 다음 문자는 C가 1개 이상 존재해야 함
      • 마지막 문자열 규칙은 { A, B, C, D, E, F } 중 0 또는 1개가 있어야 함

 

  • 입력
    • 첫번째 줄 - 테스트 케이스의 개수 T (T ≤ 20)
    • 두번째 줄부터 ~ 테스트 케이스
      • 테스트 케이스  ≤ 200
      • 대문자(A ~ Z)로만 이루어진 문자열

 

  • 출력
    • 테스트 케이스가 염색체의 특정 패턴인 경우 : Infected!
    • 테스트 케이스가 염색체의 특정 패턴이 아닌 경우 : Good!

 

  • 로직 1)
    • 첫번째 문자가 A ~ F 중 하나인지 확인하기 → 아니면 "Good!" 출력하기
    • 마지막 문자가 A ~ F 중 하나인지 확인하기 → 아니면 "Good!" 출력하기
    • 문자열 순회하기
      • A ~ F 중 아닌 문자가 있으면 "Good!" 출력하기
      • A 다음 문자가 F이고, F 다음 문자가 C인지 확인하기 → 아니면 "Good!" 출력하기
      • * 주의 * 첫번째 문자가 A인지, 마지막 문자가 C인지 확인하기
import java.util.*;
import java.io.*;

// 염색체
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int count = Integer.valueOf(br.readLine()); // 테스트 케이스 개수
        char[] pattern = new char[] {'A', 'F', 'C'}; // A - F - C 순서 패턴

        for(int i=0; i<count; i++) { // 테스트 케이스 개수만큼 반복
            boolean[] patternCheck = new boolean[3]; // pattern의 방문 여부
            int patternNum = 0; // 현재 pattern의 순서
            boolean answer = true; // 현재 테스트 케이스가 염색체의 특정 패턴을 만족하는 여부

            String testCase = br.readLine(); // 문자열
            int finalStringIndex = testCase.length() - 1; // 마지막 문자열의 인덱스 번호

            // 테스트 케이스가 염색체의 특정 패턴인지 확인하기
            if('F' < testCase.charAt(0)) answer = false; // 첫번째 문자 확인
            else if('F' < testCase.charAt(finalStringIndex)) answer = false; // 마지막 문자 확인
            else {
                if('A' == testCase.charAt(0)) patternCheck[0] = true; // 첫번째 문자 확인
                if('C' == testCase.charAt(finalStringIndex)) patternCheck[2] = true; // 마지막 문자 확인

                // A - F - C 순으로 되어 있는지 TestCase를 순회하면서 확인하기
                for(int j=1; j<finalStringIndex; j++) {
                    char ch = testCase.charAt(j);

                    if(ch != pattern[patternNum]) {
                        if(!patternCheck[patternNum] || patternNum == 2 || ch != pattern[patternNum+1]) {
                            answer = false;
                            break;
                        } else {
                            patternNum++;
                            patternCheck[patternNum] = true;
                        }
                    } else patternCheck[patternNum] = true;
                }

                // A - F - C 패턴을 모두 방문했는지 확인하기
                if(!patternCheck[0] || !patternCheck[1] || !patternCheck[2])
                    answer = false;
            }

            if(answer) System.out.println("Infected!");
            else System.out.println("Good");
        }
    }
}

 

  • 결과
    • 성공

 

  • 로직 3)
    • 정규표현식 이용하기
import java.util.*;
import java.io.*;

// 염색체
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int count = Integer.valueOf(br.readLine()); // 테스트 케이스 개수

        for (int i = 0; i < count; i++) {
            String testCase = br.readLine(); // 테스트 케이스
            String regex = "[A-F]?A+F+C+[A-F]?"; // 염색체 특징

            if(testCase.matches(regex)) System.out.println("Infected!");
            else System.out.println("Good");
        }
    }
}

 

  • 결과
    • 성공