[프로그래머스] PCCP 모의고사 1회 1번 - 외톨이 알파벳 JavaScript

Janet·2023년 10월 12일
0

Algorithm

목록 보기
276/314

문제 설명

알파벳 소문자로만 이루어진 어떤 문자열에서, 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_stringresult
"edeaaabbccd""de"
"eeddee""e"
"string""N"
"zbzbz""bz"

입출력 예 설명

입출력 예 #1

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

입출력 예 #2

  • 문제 예시와 같습니다.

입출력 예 #3

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

입출력 예 #4

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

문제풀이

  1. 알파벳이 연속적으로 발생한 부분의 중복을 제거합니다. (예시: zzddzz ⇒ zdz)
    • arr 배열을 초기화합니다. arr에 첫 번째 문자 input_string[0]를 넣습니다.
    • 문자열을 순회하면서, 현재 문자 input_string[i]arr의 마지막 요소가 같지 않을 때만 arr에 추가합니다. 이렇게 하면 연속으로 나타난 문자는 중복을 제거하게 됩니다.
  2. new Set(arr)로 배열 전체의 모든 중복 요소를 제거한 뒤, 알파벳순으로 정렬합니다. 이로써 중복을 제거하고 정렬한 배열인 set이 생성됩니다.
  3. set을 순회하면서, 각 알파벳이 원래 문자열인 arr에서 몇 번 등장하는지 세기 위한 카운트를 수행합니다. 이때 count 변수를 초기화하고, arr을 순회하여 같은 문자를 발견하면 count를 증가시킵니다.
  4. count가 1을 초과하면 해당 알파벳이 외톨이 알파벳이므로, answer 문자열에 해당 알파벳을 추가합니다.
  5. 마지막으로, 만약 answer가 빈 문자열일 경우 (즉, 외톨이 알파벳이 없을 경우), 'N'을 반환합니다.

✅ 답안

function solution(input_string) {
  let answer = '';
  const arr = [input_string[0]];

  // 뭉쳐있는 알파벳들만 중복 제거
  for (let i = 1; i < input_string.length; i++) {
    if (input_string[i] !== arr.at(-1)) {
      arr.push(input_string[i]);
    }
  }

  // 배열 전체의 모든 중복 요소 제거하고 알파벳 순 정렬
  const set = [...new Set(arr)].sort();

  for (let i of set) {
    let count = 0;
    for (let j of arr) {
      // 유니크한 set 배열과 부분 중복만 제거한 arr 배열의 요소 같으면 count 증가
      if (i === j) count++;
    }
    // 카운트가 1을 초과하면 외톨이 알파벳이므로 answer에 해당 요소 추가
    if (count > 1) answer += i;
  }

  // 중복 요소가 없었다면 answer는 빈 배열이므로 'N' 반환
  return answer === '' ? 'N' : answer;
}
profile
😸

0개의 댓글