12933 오리

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

문제설명

"quack"이라는 소리를 내는 오리의 개수를 구한다.

문자열에는 'q', 'u', 'a', 'c', 'k'가 순서대로 포함되어야 하며, 각 오리는 "quack" 소리를 한 번 내면 모든 문자를 사용해야 한다.

또한, 주어진 문자열은 유효한 오리 소리의 연속이어야 하며, 하나의 오리가 "quack" 소리를 내고 있는 동안

다른 오리들이 그 소리를 중복하지 않고 내는 방식도 고려한다.

접근방식

O(N * D) 시간복잡도

  • N은 입력 문자열의 길이이다.
  • D는 소리를 내고 있는 오리의 최대 개수이다. (리스트의 크기)

실제로 D는 "quack" 소리를 내기 위한 문자가 순차적으로 완성되어야 하므로, 일반적으로 D는 O(N/5)로 제한된다.

  • 모든 문자에 대해 각 오리의 상태를 검사해야 할 수 있으므로, O(N * D)라는 복잡도를 가진다.

문제 조건 분석 과정

 

  • 입력 검증:
    • 문자열이 'q'로 시작하지 않거나, 문자열의 길이가 5의 배수가 아니면 -1을 출력한다.
    • "quack" 소리는 5개 문자로 구성된다.
  • 오리 소리 상태 관리:
    • 리스트를 만들어 현재 소리를 내고 있는 오리들을 저장한다.
    • 각 오리는 "quack" 소리의 각 문자를 몇 번 냈는지를 계산한다.
    • 문자열의 각 문자를 순회하면서 해당 문자가 오리의 소리와 맞는지를 검사한다.
    • 만약 문자가 'q'라면 새로운 오리를 추가하고,
    • 그렇지 않다면 기존의 오리 중에서 해당 문자를 소리 내고 있는 오리를 찾아 상태를 업데이트한다.
  • 소리 완성 여부 확인:
    • 모든 오리의 소리가 완전히 끝났는지를 확인하기 위해, ducks 리스트의 모든 상태가 0인지 확인한다.
    • 그렇지 않으면 -1을 출력한다.

 

전체코드

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

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        char[] input = br.readLine().toCharArray();

        String quack = "quack";
        List<Integer> ducks = new ArrayList<>();
        int count = 0;

        if (input[0] != 'q' || input.length % 5 != 0) {
            System.out.println(-1);
            return;
        }

        for (char c : input) {
            boolean found = false;

            for (int i = 0; i < ducks.size(); i++) {
                if (quack.charAt(ducks.get(i)) == c) {
                    ducks.set(i, ducks.get(i) + 1);
                    found = true;

                    if (ducks.get(i) == 5) {
                        ducks.set(i, 0);
                    }
                    break;
                }
            }

            if (!found) {
                if (c == 'q') {
                    ducks.add(1);
                    count = Math.max(count, ducks.size());
                } else {
                    System.out.println(-1);
                    return;
                }
            }
        }

        for (int state : ducks) {
            if (state != 0) {
                System.out.println(-1);
                return;
            }
        }

        System.out.println(count);
    }
}

'자료구조 > 문제풀이' 카테고리의 다른 글

[백준 JAVA] 11048 이동하기  (0) 2024.09.26
[백준 JAVA]16985 Maaaaaaaaaze  (1) 2024.09.26
[백준 JAVA] 2812 크게 만들기  (0) 2024.09.25
[백준 JAVA] 1874 스택 수열  (0) 2024.09.25
[백준 JAVA] 20006 랭킹전 대기열  (0) 2024.09.23

+ Recent posts