상근이는 생명과학 연구소에서 염색체가 특정한 패턴인지를 확인하는 일을 하고 있다. 염색체는 알파벳 대문자 (A, B, C, ..., Z)로만 이루어진 문자열이다. 상근이는 각 염색체가 다음과 같은 규칙을 만족하는지 검사해야 한다.
문자열이 주어졌을 때, 위의 규칙을 만족하는지 구하는 프로그램을 작성하시오.
입력
첫째 줄에 테스트 케이스의 개수 T ≤ 20 이 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있으며, 최대 200개의 알파벳 대문자로 이루어진 문자열이 주어진다.
출력
각 테스트 케이스에 대해서, 문제의 규칙을 지키는 문자열인 경우에는 "Infected!"를, 아닌 경우에는 "Good"을 출력한다.
예제 입력
15
AFC
AAFC
AAAFFCC
AAFCC
BAFC
QWEDFGHJMNB
DFAFCB
ABCDEFC
DADC
SDFGHJKLQWERTYU
AAAAAAAAAAAAABBBBBBBBBBBBBBCCCCCCCCCCCCCCCCCCDDDDDDDDDDDEEEEEEEEEEEEEEEFFFFFFFFC
AAAFFFFFBBBBCCCAAAFFFF
ABCDEFAAAFFFCCCABCDEF
AFCP
AAFFCPP
예제 출력
Infected!
Infected!
Infected!
Infected!
Infected!
Good
Good
Good
Good
Good
Good
Good
Good
Good
Good
const fs = require('fs');
const input = fs.readFileSync('/dev/stdin').toString().split('\n');
const T = +input[0]; // 테스크 케이스
const availableString = ['A', 'B', 'C', 'D', 'E', 'F'];
let line = 1; // 테스트 케이스 라인
// 연속된 중복 문자 제거 함수
const removeContinuousStr = (str) => {
let removeStr = '';
str.reduce((prev, cur) => {
if (prev !== cur) removeStr += cur;
return cur;
}, '');
return removeStr;
};
// A~F 이외의 문자를 포함하고 있는지 확인하는 함수
const checkInavailableStr = (str) => {
for (let i = 0; i < str.length; i += 1) {
if (!availableString.includes(str[i])) return false;
}
return true;
};
let result = '';
while (line <= T) {
const str = input[line].split('');
// {A, B, C, D, E, F}에 포함되지 않는 문자가 있는 경우 바로 패스
if (!checkInavailableStr(str)) result += 'Good\n';
else {
// 문자 길이가 3 또는 4인 경우는 AFC만 포함하면 Infected임
if (str.length === 3 || str.length === 4)
result += str.join('').includes('AFC') ? 'Infected!\n' : 'Good\n';
// 맨 앞이랑 맨 뒤 제외하고 중간 문자열의 연속된 중복 제거한 값이 AFC이면 Infected임
else {
result +=
removeContinuousStr([...str.slice(1, str.length)]) === 'AFC'
? 'Infected!\n'
: 'Good\n';
}
}
line += 1;
}
result = result.trimEnd();
console.log(result);
구하는 것 = 각 테스트 케이스 별로 문제 규칙 지키는지 확인(O⇒Infected!, X⇒’Good!’)
[문제 규칙]
풀이 ⇒ 문자열 이용
문자 길이가 3 또는 4인 경우 ‘AFC’를 포함하면 Infected
⇒ AFC는 무조건 포함해야 되므로 최소길이는 3임
문자 길이가 5이상인 경우 맨 앞과 맨 뒤 제외한 중간값은 A, F, C 만 존재해야 함
⇒ 중간문자열의 연속된 중복 제거해서 AFC만 남으면 Infected