백준_염색체_9342

Minji Lee·2024년 10월 12일
0

JS코딩테스트

목록 보기
75/122

염색체

문제

상근이는 생명과학 연구소에서 염색체가 특정한 패턴인지를 확인하는 일을 하고 있다. 염색체는 알파벳 대문자 (A, B, C, ..., Z)로만 이루어진 문자열이다. 상근이는 각 염색체가 다음과 같은 규칙을 만족하는지 검사해야 한다.

  • 문자열은 {A, B, C, D, E, F} 중 0개 또는 1개로 시작해야 한다.
  • 그 다음에는 A가 하나 또는 그 이상 있어야 한다.
  • 그 다음에는 F가 하나 또는 그 이상 있어야 한다.
  • 그 다음에는 C가 하나 또는 그 이상 있어야 한다.
  • 그 다음에는 {A, B, C, D, E, F} 중 0개 또는 1개가 있으며, 더 이상의 문자는 없어야 한다.

문자열이 주어졌을 때, 위의 규칙을 만족하는지 구하는 프로그램을 작성하시오.

입력

첫째 줄에 테스트 케이스의 개수 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

Code

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!’)

    [문제 규칙]

    1. {A, B, C, D, E, F} 중 0개 또는 1개로 시작
    2. 그 다음에 A가 하나 또는 그 이상
    3. 그 다음에 F가 하나 또는 그 이상
    4. 그 다음에 C가 하나 또는 그 이상
    5. 그 다음에 {A, B, C, D, E, F} 중 0개 또는 1개있고, 그 다음에 존재 X
  • 풀이 ⇒ 문자열 이용

    1. A~F 이외의 문자가 존재하면 Good
    2. 존재하지 않는 경우
      1. 문자 길이가 3 또는 4인 경우 ‘AFC’를 포함하면 Infected

        ⇒ AFC는 무조건 포함해야 되므로 최소길이는 3임

      2. 문자 길이가 5이상인 경우 맨 앞과 맨 뒤 제외한 중간값은 A, F, C 만 존재해야 함

        ⇒ 중간문자열의 연속된 중복 제거해서 AFC만 남으면 Infected

0개의 댓글