본문 바로가기

알고리즘 공부 및 문제 풀이/백준(BOJ)

[boj] 백준 12933 오리 (Java) - 그리디

[문제]

https://www.acmicpc.net/problem/12933

 

12933번: 오리

첫째 줄에 영선이가 녹음한 소리가 주어진다. 소리의 길이는 5보다 크거나 같고, 2500보다 작거나 같은 자연수이고, 'q','u','a','c','k'로만 이루어져 있다.

www.acmicpc.net

 

[풀이]

연속되는 'quack'을 찾아 '.'으로 치환시켜주고 전체 문자열 개수에서 5씩 차감시킨다.

연속되는 'quack'을 찾을 수 있다면 오리 개수를 증가시키고, 이후 남은 문자 개수가 0이라면 정답을 출력한다.

연속되는 'quack'을 찾을 수 없다면 잘못된 오리 울음이므로 -1을 출력한다.

 

quqacukqauackck

..q..u..a....ck //처음 for문 돈 이후
............... //두번째 for문 돈 이후. 남은 문자개수 0개이므로 break

 

[코드]

 

package 그리디;

import java.util.*;
import java.io.*;

public class boj_12933_오리 {
    static String s;
    static char[] input;
    static int answer;
    static char[] quack = {'q', 'u', 'a', 'c', 'k'};
    public static void main(String[] args) throws Exception{
        // 영선이 방에 있을 수 있는 오리의 최소 개수를 구하는 프로그램을 작성하시오.
        Scanner scan = new Scanner(System.in);
        s = scan.nextLine();

        input = s.toCharArray();

        if(s.length()%5!=0) {
            System.out.println(-1);
            return;
        }

        int idx = 0;
        int total = s.length();
        while(true){
            int ptr = 0;
            int[] temp = new int[5]; //quack 인덱스 저장
            int tid = 0;
            boolean flag = false;
            for(int i=0; i<s.length(); i++){
                if(input[i]==quack[ptr]){
                    temp[tid++] = i;
                    ptr++;
                }
                if(ptr==5){ //올바른 오리 울음 소리
                    flag = true; 
                    ptr = 0;
                    tid = 0;
                    //index '.'로 치환
                    total -= 5;
                    for(int j=0; j<5; j++){
                        input[temp[j]] = '.';
                    }
                }
            }

            if(flag) answer++;
            else {
                System.out.println(-1);
                return;
            }

            if(total==0) break;

        }

        System.out.println(answer);
    }
    
}