https://www.acmicpc.net/problem/12933
올바른 오리의 울음 소리는 울음 소리를 한 번 또는 그 이상 연속해서 내는 것이다. 예를 들어, "quack", "quackquackquackquack", "quackquack"는 올바른 오리의 울음 소리이다.
오리의 수를 세기 위해 HashMap
을 사용하여 map(오리 번호, 해당 오리의 현재 문자열 사이즈)
을 저장한다.
그 다음 문자를 입력받을 때마다, map 엔트리를 탐색해 알맞은 오리를 찾아 그 오리의 value값에 1을 더한다.
예를 들면, 'a'(idx=2) 를 만나면 값이 2('qu')인 map 엔트리의 값을 3으로 바꾼다.
주의
boolean
형 변수 flag
, fail
을 추가한다.quackqauckquack
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);
}
}
}