[PCCP 모의고사 #1] 외톨이 알파벳

Moky·2023년 4월 12일
0

PCCP

목록 보기
1/9

문제

문제 링크

알파벳 소문자로만 이루어진 어떤 문자열에서, 2회 이상 나타난 알파벳이 2개 이상의 부분으로 나뉘어 있으면 외톨이 알파벳이라고 정의합니다.

문자열 "edeaaabbccd"를 예시로 들어보면,

  • a는 2회 이상 나타나지만, 하나의 덩어리로 뭉쳐있으므로 외톨이 알파벳이 아닙니다.
    • "ede(aaa)bbccd"
  • b, c도 a와 같은 이유로 외톨이 알파벳이 아닙니다.
  • d는 2회 나타나면서, 2개의 부분으로 나뉘어 있으므로 외톨이 알파벳입니다.
    • "e(d)eaaabbcc(d)"
  • e도 d와 같은 이유로 외톨이 알파벳입니다.

문자열 "eeddee"를 예시로 들어보면,

  • e는 4회 나타나면서, 2개의 부분으로 나뉘어 있으므로 외톨이 알파벳입니다.
    • "(ee)dd(ee)"
  • d는 2회 나타나지만, 하나의 덩어리로 뭉쳐있으므로 외톨이 알파벳이 아닙니다.
    • "ee(dd)ee"

문자열 input_string이 주어졌을 때, 외톨이 알파벳들을 알파벳순으로 이어 붙인 문자열을 return 하도록 solution 함수를 완성해주세요. 만약, 외톨이 알파벳이 없다면 문자열 "N"을 return 합니다.


제한사항
  • 1 ≤ input_string의 길이 ≤ 2,600
  • input_string은 알파벳 소문자로만 구성되어 있습니다..

입출력 예
input_string result
"edeaaabbccd" "de"
"eeddee" "e"
"string" "N"
"zbzbz" "bz"

입출력 예 설명

입출력 예 #1

  • 문제 예시와 같습니다.
  • 외톨이 알파벳인 e, d를 알파벳순으로 이어 붙여 문자열을 만들면 "de"가 됩니다.

입출력 예 #2

  • 문제 예시와 같습니다.

입출력 예 #3

  • 모든 문자들이 한 번씩만 등장하므로 외톨이 알파벳이 없습니다.

입출력 예 #4

  • 외톨이 알파벳인 z, b를 알파벳순으로 이어 붙여 문자열을 만들면 "bz"가 됩니다.

풀이

연속해서 나타나지 않는 알파벳을 찾은뒤 사전 순으로 나열해 반환하면 된다.
알파벳이 26자밖에 되지않아 해당하는 알파벳을 찾는 작업과 정렬하는 작업을 따로해도 되지만, 조금이라도 좋은 성능을 위해 알파벳 길이의 배열을 사용해 해당하는 알파벳의 위치를 체크하는 방식으로 문제를 해결했다.

코드

function solution(input_string) {
  const alpha = Array.from({ length: 26 }, () => 0);
  const dir = {};
  const a_code = "a".charCodeAt(0);
  for (const i in input_string) {
    if (!dir[input_string[i]]) dir[input_string[i]] = [];
    dir[input_string[i]].push(Number(i));
  }
  for (const key in dir) {
    if (dir[key][dir[key].length - 1] - dir[key][0] !== dir[key].length - 1)
      alpha[key.charCodeAt(0) - a_code] = key.charCodeAt(0);
  }
  return (
    String.fromCharCode(...alpha.filter((x, i) => i === x - a_code)) || "N"
  );
}

아래는 정답자 코드중 잘풀었다고 생각하는 코드
짧고 코드의 목적을 파악하기 쉬워서 좋다고 생각한다.

정답 코드 링크

function solution(input_string) {
  const ALPHABET = Array.from({ length: 26 }, (v, i) =>
    String.fromCharCode(i + 97)
  );

  let answer = ALPHABET.filter((c) => {
    const regex = new RegExp(`${c}+[^${c}]+${c}+`);
    return regex.test(input_string);
  }).join("");

  return answer || "N";
}

0개의 댓글