Post

PCCP 모의고사 1 1번 - 외톨이 알파벳

https://school.programmers.co.kr/learn/courses/15008/lessons/121683

📔 문제 설명

알파벳 소문자로만 이루어진 어떤 문자열에서, 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 합니다.

💡 입출력 예

input_stringresult
“edeaaabbccd”“de”
“eeddee”“e”
“string”“N”
“zbzbz”“bz”

💻내가 작성한 코드

  1. 연속되는 글자 지우기
  2. 알파벳순으로 정렬하고 외톨이 알파벳 구하기
  3. 만약 배열의 길이가 0이면 “N”을 얼리 리턴
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
function solution(input_string) {
  const answer = [];
  const setString = [];

  // 연속되는 글자 삭제
  input_string.split("").forEach((str) => {
    if (str !== setString.at(-1)) {
      setString.push(str);
    }
  });

  // 알파벳순으로 정렬하고 외톨이 알파벳 구하기
  setString
    .sort((a, b) => a.localeCompare(b))
    .forEach((str) => {
      const isLoner = setString.filter((s) => s === str).length > 1;
      if (isLoner && str !== answer.at(-1)) {
        answer.push(str);
      }
    });

  if (answer.length === 0) return "N";
  return answer.join("");
}
This post is licensed under CC BY 4.0 by the author.