프로그래머스 JS LV0

LV0 59 한 번만 등장한 문자

와라리요 2022. 10. 25. 15:07

문제

 - 문자열 s가 매개변수로 주어집니다. s에서 한 번만 등장하는 문자를 사전 순으로 정렬한 문자열을 return 하도록 solution 함수를 완성해보세요. 한 번만 등장하는 문자가 없을 경우 빈 문자열을 return 합니다.

 

입출력 예

s result
"abcabcadc" "d"
"abdc" "abcd"
"hello" "eho"

 

나만의 풀이

  엄청 고생한 문제다 ㅜㅜ 우선 문제의 특징은 값이 출력이 될 때 알파벳의 순서로 정렬되어 있다는 것을 숙지하고 가야 했다. 우선 매개변수 s에 주어지는 문자열은 배열로 만들고 중복된 글자를 제거했다.

  그 후 resuce()를 이용해 객체를 만들어 존재하는 알파벳을 키로 두고 개수를 값으로 만든다. for문을 이용해 키의 값이 1과 동일하면 빈 배열에 push한 후 sort()를 이용해서 순서로 정렬한 후 join()을 이용해서 합쳤다.

function solution(s) {
    let answer =[];
    const set = new Set(s.split(''));
    const setArr = [...set];
    const getElCount = [...s].reduce((ac, v) => ({ ...ac, [v]: (ac[v] || 0) + 1}), {});
    for (let i = 0; i < setArr.length; i++) {
        if (getElCount[setArr[i]] === 1) {
            answer.push(setArr[i])
        }
    }
    return answer.sort().join('');
}

 

  그리고 너무 복잡하세 만들었다는 생각을 깨지 못해서 다른 사람들의 풀이를 봤다. 그런데... ㅜㅜ 사용하지 않은 내장 함수를 이용해 간단하게 푼 답변이 있어서 소개를 해본다. 설명을 하면 빈 배열을 선언하고 for of문을 이용해 원소 길이만큼 반복하게 하고 원소를 반환한다.

  그리고 if문을 이용해 반환된 원소의 첫 번째 index의 번호와 lastIndex번호가 동일하면 원소를 빈 배열에 넣고 배열은 리턴 부분은 위와 동일하다.

function solution(s) {
    let res = [];
    for (let c of s) if (s.indexOf(c) === s.lastIndexOf(c)) res.push(c);
    return res.sort().join('');
}