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 |