Algorithm/Java

[알고리즘_Java] 백준 5555번 반지 (substring)

Cune 2022. 2. 25. 21:32

 


 

 

 

<풀이>

 

"abc"를 찾고있다고 하고 문자열이 "cflwdadcab"가 주어졌다고 가정한다.

"cflwdadcab"의 끝부분 "ab"가 끝이 아닌 첫부분 "cfl~"가 붙어있다고 생각해서 "abc" , "bcf"까지 비교해야한다.

import java.io.*;

public class Main {

    public static void main(String[] args) throws IOException {


        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        String ss = br.readLine();  //ex) abc
        int n = ss.length();	// abc길이 3

        int t = Integer.parseInt(br.readLine());	//비교반지 갯수만큼 입력 

        int cnt = 0;

        for (int j = 0; j < t; j++) {

            String st = br.readLine();  //ex) cflwdadcab
            String s = "";

            for (int i = 0; i < st.length(); i++) { //입력받은 글자의 마지막까지 비교해야함

                if(n+i>st.length()){    //(마지막 ab에서 첫글자 c로 가는경우)
                    int plus = i-st.length()+n;	
                    // i=8(문자끝까지는 'ab') - 10(글자길이) + 3(찾아야 하는 문자 abc 길이 ) 
                    // => 구한 plus가 부족한 문자갯수로 알 수 있다
                    
                    s = st.substring(i)+st.substring(0,plus);
                    //i부터 문자끝까지 구하고 거기에 부족한 갯수만큼 문자의 처음부터 다시 가져온다
                    
                }else{  //갯수가 부족하지않고 입력된 글자순대로 흘러갈때
                    s = st.substring(i,n+i);
                }

                if(s.equals(ss)){
                    cnt++;  //원하는 문자열을 찾았을때 카운트 세고 종료
                    break;
                }
            }
        }

        bw.write(cnt + "");
        bw.close();

    }
}

글자 끝부분에서 substring을 했을때 비교문자열보다 작은경우에 다시 첫글자로 돌아가서 비교해줘야 하는데 이부분이 복잡해서 그렇지 하나씩 잘라서 비교하고 계산해보면 그렇게 어렵지 않았던 것 같다.