[백준 12933] 오리 (자바스크립트)
문제
오리의 울음 소리는 "quack"이다. 올바른 오리의 울음 소리는 울음 소리를 한 번 또는 그 이상 연속해서 내는 것이다. 예를 들어, "quack", "quackquackquackquack", "quackquack"는 올바른 오리의 울음 소리이다.
영선이의 방에는 오리가 있는데, 문제를 너무 열심히 풀다가 몇 마리의 오리가 있는지 까먹었다.
갑자기 영선이의 방에 있는 오리가 울기 시작했고, 이 울음소리는 섞이기 시작했다. 영선이는 일단 울음소리를 녹음했고, 나중에 들어보면서 총 몇 마리의 오리가 있는지 구해보려고 한다.
녹음한 소리는 문자열로 나타낼 수 있는데, 한 문자는 한 오리가 낸 소리이다. 오리의 울음 소리는 연속될 필요는 없지만, 순서는 "quack"이어야 한다. "quqacukqauackck"과 같은 경우는 두 오리가 울었다고 볼 수 있다.
영선이가 녹음한 소리가 주어졌을 때, 영선이 방에 있을 수 있는 오리의 최소 개수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 영선이가 녹음한 소리가 주어진다. 소리의 길이는 5보다 크거나 같고, 2500보다 작거나 같은 자연수이고, 'q','u','a','c','k'로만 이루어져 있다.
#풀이 과정
1. 각 오리는 무조건 'q' → 'u' → 'a' → 'c' → 'k' → 'q' ... 순서로 울어야 함
2. 각 오리마다 다음에 울어야 하는 소리를 기록해 놓았다가 현재 값이 기록에 포함되어 있는지 확인
3. 현재 값이 기록에 포함되어 있다면 해당하는 값을 다음 값으로 넘김
4. 아니라면 아직 기록에 포함되어 있지 않은 새 오리의 울음소리인데, 1. 에 의해 새 오리는 처음에 무조건 q로 울어야 함
4-1. 따라서 q라면 새 오리를 추가하고 다음에 울어야 하는 소리인 u를 기록
4-2. q가 아니라면 녹음이 잘못된 것이므로 -1 반환
+ 그리고 끝까지 체크했을 때 모든 오리가 'k'까지 울었으므로 다음에 울어야 하는 소리는 무조건 'q', 즉 0이어야 함
const input = require("fs")
.readFileSync(
process.platform === "linux" ? "/dev/stdin" : "./BOJ/BOJ_test.txt"
)
.toString()
.trim();
const QUACK = "quack";
// 각 오리가 다음에 내야 할 글자의 순서
const ducks = [];
let maxDucks = 0;
for (const ch of input) {
// 현재 값이 'quack' 중 몇 번째인지 찾기
const sound = QUACK.indexOf(ch);
// 현재 값이 'quack'에 속한 글자가 아니라면 -1 반환
if (sound === -1) {
console.log(-1);
return;
}
// 현재 내야 할 글자가 sound인 오리 찾기
// 해당 오리의 번호 found
let found = -1;
for (let i = 0; i < ducks.length; i++) {
if (ducks[i] === sound) {
found = i;
break;
}
}
// 현재 내야 할 글자가 sound인 오리가 없다면
if (found === -1) {
// sound가 q가 아니라면 -1 반환
if (sound !== 0) {
console.log(-1);
break;
}
// 새 오리 추가해 내야 할 글자를 'u'로 지정
ducks.push(1);
// 최대 오리 수 갱신
maxDucks = Math.max(maxDucks, ducks.length);
} else {
// 현재 내야 할 글자가 sound인 오리가 있다면
// 다음 글자로 이동
ducks[found] = (sound + 1) % 5;
}
}
// ducks의 모든 오리가 'quack'을 냈는지 확인
if (ducks.some((state) => state !== 0)) {
// 하나라도 'quack'을 다 안 냈다면 -1 반환
console.log(-1);
} else {
console.log(maxDucks);
}