Skip to content

Commit b8c8062

Browse files
committed
[Silver II] Title: 오리, Time: 140 ms, Memory: 15988 KB -BaekjoonHub
1 parent 9eb95ad commit b8c8062

2 files changed

Lines changed: 94 additions & 0 deletions

File tree

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
# [Silver II] 오리 - 12933
2+
3+
[문제 링크](https://www.acmicpc.net/problem/12933)
4+
5+
### 성능 요약
6+
7+
메모리: 15988 KB, 시간: 140 ms
8+
9+
### 분류
10+
11+
그리디 알고리즘, 구현, 문자열
12+
13+
### 제출 일자
14+
15+
2025년 1월 27일 14:46:16
16+
17+
### 문제 설명
18+
19+
<p>오리의 울음 소리는 "quack"이다. 올바른 오리의 울음 소리는 울음 소리를 한 번 또는 그 이상 연속해서 내는 것이다. 예를 들어, "quack", "quackquackquackquack", "quackquack"는 올바른 오리의 울음 소리이다.</p>
20+
21+
<p>영선이의 방에는 오리가 있는데, 문제를 너무 열심히 풀다가 몇 마리의 오리가 있는지 까먹었다.</p>
22+
23+
<p>갑자기 영선이의 방에 있는 오리가 울기 시작했고, 이 울음소리는 섞이기 시작했다. 영선이는 일단 울음소리를 녹음했고, 나중에 들어보면서 총 몇 마리의 오리가 있는지 구해보려고 한다.</p>
24+
25+
<p>녹음한 소리는 문자열로 나타낼 수 있는데, 한 문자는 한 오리가 낸 소리이다. 오리의 울음 소리는 연속될 필요는 없지만, 순서는 "quack"이어야 한다. "quqacukqauackck"과 같은 경우는 두 오리가 울었다고 볼 수 있다.</p>
26+
27+
<p>영선이가 녹음한 소리가 주어졌을 때, 영선이 방에 있을 수 있는 오리의 최소 개수를 구하는 프로그램을 작성하시오.</p>
28+
29+
### 입력
30+
31+
<p>첫째 줄에 영선이가 녹음한 소리가 주어진다. 소리의 길이는 5보다 크거나 같고, 2500보다 작거나 같은 자연수이고, 'q','u','a','c','k'로만 이루어져 있다.</p>
32+
33+
### 출력
34+
35+
<p>영선이 방에 있을 수 있는 오리의 최소 수를 구하는 프로그램을 작성하시오. 녹음한 소리가 올바르지 않은 경우에는 -1을 출력한다.</p>
36+
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
import java.io.*;
2+
import java.util.*;
3+
4+
public class Main {
5+
public static void main(String[] args) throws IOException {
6+
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
7+
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(System.out));
8+
9+
String s = reader.readLine();
10+
int length = s.length();
11+
12+
boolean[] visited = new boolean[length]; // 문자의 처리 여부를 기록
13+
int result = 0;
14+
15+
for (int i = 0; i < length; i++) {
16+
if (!visited[i] && s.charAt(i) == 'q') { // 아직 처리되지 않은 'q'를 만났을 때
17+
if (!findQuack(i, s, visited)) { // 잘못된 입력이면 -1
18+
result = -1;
19+
break;
20+
}
21+
result++; // 한 마리의 오리를 처리
22+
}
23+
}
24+
25+
// 모든 문자가 처리되었는지 확인
26+
for (int i = 0; i < length; i++) {
27+
if (!visited[i]) {
28+
result = -1;
29+
break;
30+
}
31+
}
32+
33+
writer.write(result + "\n");
34+
writer.flush();
35+
writer.close();
36+
}
37+
38+
public static boolean findQuack(int idx, String s, boolean[] visited) {
39+
String quack = "quack";
40+
int quackIdx = 0;
41+
42+
for (int i = idx; i < s.length(); i++) {
43+
if (visited[i]) continue; // 이미 처리된 문자는 건너뜀
44+
45+
if (s.charAt(i) == quack.charAt(quackIdx)) { // 현재 단계와 일치하는 문자
46+
visited[i] = true; // 해당 문자를 처리 완료로 표시
47+
quackIdx++;
48+
49+
if (quackIdx == 5) { // "quack"을 완성하면 초기화
50+
quackIdx = 0;
51+
}
52+
}
53+
}
54+
55+
// "quack"이 완전히 매칭되지 못한 경우
56+
return quackIdx == 0;
57+
}
58+
}

0 commit comments

Comments
 (0)