백준 12933 오리[Java]

seren-dev·2022년 9월 7일
0

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

풀이

올바른 오리의 울음 소리는 울음 소리를 한 번 또는 그 이상 연속해서 내는 것이다. 예를 들어, "quack", "quackquackquackquack", "quackquack"는 올바른 오리의 울음 소리이다.

오리의 수를 세기 위해 HashMap을 사용하여 map(오리 번호, 해당 오리의 현재 문자열 사이즈) 을 저장한다.
그 다음 문자를 입력받을 때마다, map 엔트리를 탐색해 알맞은 오리를 찾아 그 오리의 value값에 1을 더한다.
예를 들면, 'a'(idx=2) 를 만나면 값이 2('qu')인 map 엔트리의 값을 3으로 바꾼다.

주의

  • 문자열의 문자를 체크하다가 오리의 울음소리가 될 수 없는 소리(문자)를 만날 경우를 처리하기 위해 boolean형 변수 flag, fail을 추가한다.
    ex) 예제 입력 6 quackqauckquack
  • map의 엔트리를 탐색하다가 값이 5가 아닌 오리가 있을 경우, 올바른 오리의 울음소리가 아니므로, 이 경우도 -1을 출력해야 한다.

코드

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


public class Main {

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

        String str = br.readLine();
        String duck = "quack";
        HashMap<Integer, Integer> map = new HashMap<>();
        int num = 0; // 오리 번호

        boolean fail = false; // 오리의 울음소리가 될 수 없는 소리(문자)가 있을 때 true

        int cnt = 0;

        for (int i = 0; i < str.length(); i++) {

            if (str.charAt(i) == 'q') { // 문자가 'q'인 경우 따로 처리

                boolean flag = false;
                for (int key: map.keySet()) {
                    if (map.get(key) == 5) {
                        map.put(key, 1);
                        flag = true;
                        break;
                    }
                }
                if (!flag) // 새로운 오리 추가
                    map.put(num++, 1);
            }

            else {

                int idx = duck.indexOf(String.valueOf(str.charAt(i))); // duck 문자열의 인덱스 위치

                boolean flag = false;  // 오리의 울음소리가 될 수 없는 소리(문자)가 있을 때 true

                for (int key: map.keySet()) {

                    if (map.get(key) == idx) {
                        map.put(key, map.get(key)+1);
                        flag = true;
                        break;
                    }
                }

                if (!flag) {
                    // 올바른 오리의 울음소리가 아니므로 반복문 종료
                    fail = true;
                    break;
                }

            }
        }

        if (fail) {
            // 올바른 오리의 울음소리가 아니므로 -1 출력
            System.out.println(-1);
        }
        else {
            for (int key : map.keySet()) {

                if (map.get(key) == 5) {
                    // 값이 5라면 올바른 오리가 있다
                    cnt++;
                }
                else {
                    // 올바른 오리의 울음소리가 아닌 경우
                    cnt = 0;
                    break;
                }
            }

            System.out.println(cnt == 0 ? -1 : cnt);
        }

    }

}

0개의 댓글