본문 바로가기

백준

백준 12933 오리 (JAVA)

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

 

12933번: 오리

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

www.acmicpc.net

코드

package com.company;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/*
    오리는 꽥꽥
    quack 문자를 미리 만들어 input 값에서 q를 방문했으면 index를 증가시키고 다음 문자를 비교하도록 한다.
*/

public class test {

    static String quack = "quack";
    static int len = quack.length();
    //오리 수
    static int cnt = 0;
    static boolean[] visit;
    static String duck = "";

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        duck = br.readLine();
        visit = new boolean[duck.length()];

        //예외 처리 - 만약 입력값의 길이가 5이하 이면 제대로 된 울음소리가 아니기 때문
        if (duck.length() % 5 != 0) {
            System.out.println(-1);
            return;
        }

        //현재 지점은 미방문 상태이며 q일 경우 오리 개수 구함
        for (int i = 0; i < duck.length(); i++) {
            if (duck.charAt(i) == 'q' && !visit[i]) {
                go(i);
            }
        }

        //만약 방문하지 못한 지점이 있는 오류를 확인하는 경우
        for (int i = 0; i < duck.length(); i++) {
            if (visit[i] == false) {
                System.out.println(-1);
                return;
            }
        }

        //전부 방문하였음에도 불구하고 완성하지 못한 오리소리가 있다면 오류
        if (cnt == 0) {
            System.out.println(-1);
            return;
        }

        System.out.println(cnt);

    }

    //start는 항상 q로 시작
    static void go(int start) {
        int j = 0;
        boolean first = true;
        for (int i = start; i < duck.length(); i++) {
            //미방문인 입력값과 "quack"문자열 과 하나하나 비교
            if (duck.charAt(i) == quack.charAt(j) && !visit[i]) {
                //방문 처리
                visit[i] = true;
                if (duck.charAt(i) == 'k') {
                    //하나의 오리가 낼수있는 소리인지를 확인
                    if (first) {
                        cnt++;
                        first = false;
                    }
                    j = 0;
                    continue;
                }
                //"quack"의 다음 문자로 넘어가기 위해 j++
                j ++;
            }
        }
    }
}

풀이

해답을 생각해내는 것에 있어서 그리 어렵지는 않았지만 계속해서 틀렸다고 나와 고생한 문제이다.

결국은 정답을 보고 이해를 하기로 하였다. 이번 문제를 통해서 예외처리를 꼼꼼히 해야겠다는 생각을 하였으며 for문 안에서도 제어 변수를 두 개를 이용해서 “quack”과 duck의 문자열을 비교하면서 진행한다.

'백준' 카테고리의 다른 글

백준 20436 ZOAC 3 (JAVA)  (0) 2022.07.15
백준 10994 별찍기 - 19 (JAVA)  (0) 2022.07.14
백준 1913 달팽이 (JAVA)  (0) 2022.07.11
백준 4396 지뢰 찾기 (JAVA)  (0) 2022.07.08
백준 2578 빙고 (JAVA)  (0) 2022.07.07