본문 바로가기

CodingTEST

[SW Expert D2] 2007. 패턴 마디의 길이

반응형

2007. 패턴 마디의 길이

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

문제 분석

 

  • 문자열에서 반복되는 부분(마디)의 길이를 출력해라

 

해결 포인트

 

  • 시간은 30초로 넉넉해서 생각한대로 구현해도 됨
  • 첫번째 문자와 동일한 문자가 발견되면 추측 시작
    • 마디 추측 중인지를 알 수 있는 변수 : isChecking
    • 동일한 문자의 index 저장 : secondStart
  • 마디 추측 방법
    • 첫번째 문자(firsrtStart)를 0부터 index를 증가시키면서 문자가 동일한지 확인
    • secondStart까지 인덱스가 증가하면 secondStart까지의 길이가 마디의 길이
    • 중간에 동일하지 않을 경우, 마디 추측 종료 및 첫 번째 문자 0으로 초기화
  • firsrtStart는 0으로 초기화하면 확인 for문은 1부터 시작해야함

 

코드

 

import java.util.Scanner;

class Solution
{
    public static void main(String args[]) throws Exception
    {
        Scanner sc = new Scanner(System.in);

        int T;
        T=sc.nextInt();
        sc.nextLine();

        for(int test_case = 1; test_case <= T; test_case++)
        {
            String s = sc.nextLine();

            int firstStart = 0;
            int secondStart = 0;
            boolean isChecking = false;

            int result = 0;

            for(int i=1;i<s.length();i++) {
                // 마디 추측되고 있는 중이 아닐 경우
                if(!isChecking) {
                    // 첫번째 문자와 동일 문자가 발견되면 마디 추측 시작
                    if (s.charAt(i) == s.charAt(firstStart)) {
                        secondStart = i;
                        firstStart++;
                        isChecking = true;
                    }
                }
                // 마디 추측 중
                else {
                    // 마디가 다른지 첫번째 문자가 같았던 index까지 반복
                    if(s.charAt(i) == s.charAt(firstStart)) {
                        firstStart++;
                        // 첫번째 문자가 같았던 index까지 마디가 같을 경우 결과 도출 및 종료
                        if(secondStart == firstStart) {
                            result = secondStart;
                            break;
                        }
                    }
                    // 마디가 다를시 마디추측 종료 및 초기화
                    else {
                        firstStart = 0;
                        isChecking = false;
                    }
                }
            }
            System.out.println("#" + test_case + " " + result);
        }
    }
}
반응형