[JAVA][정올 2514] 문자열 찾기

SHORTCUT

    반응형
    사이트명 정올
    문제 링크 jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=1775&sca=2050
    주요 알고리즘 #문자열탐색
    사용 언어 Java 자바
    설명이 장황합니다.. 도움되는 것만 파악하세요 :-)

    1. 문제

     

    2. 입력 / 출력

     

     


    3. 풀이

    3-1. 생각 노트

    타겟이 되는 문자열을 char[] 배열에 넣고, 그 갯수만큼 추가로 for문을 돌면서 맞는지 체크한다!

    여기선 KOI, IOI 둘다 O I 여서 그냥 target 배열 하나만 만들어서 2회만 돌렸다.

    다만, 맞을 때마다 i 값을 증가시키고, 아니라면 temp에 저장한 인덱스 값으로 원상복귀 시킨다!

     

    그리고, 문자열이 맞다면 i 값을 하나 줄여서 다시 그 자리부터 체크하도록 한다.

    다만, 마지막 문자가 I 혹은 K라면 if문 안에 [++i] 로 아웃오브인덱스 에러가 발생하므로

    배열 크기보다 크다면 끝내도록 지정한다.

     

    3-2. 변수명

    변수명 설명
    char[] target 비교하려는 타겟 문자열을 두어서 for문으로 순차적으로 비교하게 둔다
       

     

    3-3. 코드 보기

    /**************************************************************
        Problem: 2514
        Language: Java
        Result: Success
        Time:355 ms
        Memory:17416 kb
    ****************************************************************/
     
     
    import java.util.Scanner;
     
    public class Main {
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
     
            char[] input = sc.nextLine().toCharArray();
     
            /*
             * 풀이 순서 1. 모두 다 배열에 넣기 2. 앞에부터 가면서, K 혹은 I로 시작하는지 확인하기 3. 둘 중 조건에 만족했다면, 재귀를
             * 태워서 연속 세개인지 확인하기 4. 연속 세개가 맞다면 해당 숫자만큼 i 값을 더해서 앞으로 전진시키기
             * 
             */
     
            char[] target = { 'O', 'I' };
     
            int cntKOI = 0;
            int cntIOI = 0;
     
    here: for (int i = 0; i < input.length; i++) {
                int temp = i;
                 
                if(i >= input.length-1) break;
     
                if (input[i] == 'K') {
     
                    for (int j = 0; j < 2; j++) {
                        if (input[++i] != target[j]) {
                            i = temp;
                            continue here;
                        }
                    }
                    cntKOI++;
                    i--;
                } else if (input[i] == 'I') {
     
                    for (int j = 0; j < 2; j++) {
                        if (input[++i] != target[j]) {
                            i = temp;
                            continue here;
                        }
                    }
                    cntIOI++;
                    i--;
                }
            }
     
            System.out.println(cntKOI);
            System.out.println(cntIOI);
        }
     
    }

     

    3-4. 마무리

    이런 류의 다중 for문은 꼭 레이블(here)을 붙여서 제어하곤 한다..

    이렇게 해도 괜찮겠지?

     

     

     

     

     

     

    반응형

    댓글

    Designed by JB FACTORY