[프로그래머스] 한 번만 등장한 문자
답
function solution(s) {
return [...s].filter(el =>
[...s].filter(el2 => el === el2).length === 1
).sort().join('');
}
동작 방식
1. 문자열을 배열로 변환
[...s] // 예를 들어, s가 "aabbcd"라면 ['a', 'a', 'b', 'b', 'c', 'd']
2. 첫 번째 filter
- filter 메소드는 배열의 각 요소를 순회하며, 주어진 조건을 만족하는 요소들만을 새로운 배열에 포함시킵니다.
- 여기서 조건은 각 문자가 문자열에서 한 번만 나타나는지 확인하는 것입니다.
3. 두 번째 filter
- 내부 filter는 첫 번째 filter의 조건으로 사용됩니다.
- 이 내부 filter는 현재 문자 el와 같은 문자를 찾기 위해 문자열 전체를 다시 순회합니다.
- el => el === el2 조건을 통해 문자열 내에서 el과 같은 문자를 찾습니다.
- 이 조건을 만족하는 문자들로 새로운 배열을 만듭니다.
[...s].filter(el2 => el === el2)
4. 중복된 문자의 개수 확인
- 내부 filter가 변환한 배열의 길이를 확인합니다.
- 이 배열의 길이가 1이면, 해당 문자는 문자열 's'에서 한 번만 나타나는 것입니다.
[...s].filter(el2 => el === el2).length === 1
5. 중복되지 않는 문자들만 포함
- 첫 번째 filter는 내부 filter의 결과가 true인 문자들만을 포함합니다.
- 즉, 내부 filter로 확인된 중복되지 않는 문자들만 첫 번째 filter의 결과로 남게 됩니다.
6. 정렬 및 문자열 변환
- 중복되지 않는 문자들로 이루어진 배열을 sort 메소드를 사용하여 알파벳 순으로 정렬합니다.
- 정렬된 배열을 join('')을 사용하여 하나의 문자열로 변환합니다.
예제
예를 들어, 문자열 s가 aabbcd 일 때
1. s를 문자 배열로 변환 ['a', 'a', 'b', 'b', 'c', 'd']
2. 첫 번째 filter는 각 문자를 순회합니다.
- el 이 a일 때
- 내부 filter : ['a', 'a', 'b', 'b', 'c', 'd'].filter(el2 => el2 === 'a')의 결과 ['a', 'a']
- 길이 확인 : ['a', 'a'].length === 2 이므로 조건 불충족
- el 이 b일 때
- 내부 filter : ['a', 'a', 'b', 'b', 'c', 'd'].filter(el2 => el2 === 'b')의 결과 ['b', 'b']
- 길이 확인 : ['b', 'b'].length === 2 이므로 조건 불충족
- el 이 c일 때
- 내부 filter : ['a', 'a', 'b', 'b', 'c', 'd'].filter(el2 => el2 === 'c')의 결과 ['c']
- 길이 확인 : ['c'].length === 1 이므로 조건 충족, 'c' 포함
- el 이 d일 때
- 내부 filter : ['a', 'a', 'b', 'b', 'c', 'd'].filter(el2 => el2 === 'd')의 결과 ['d']
- 길이 확인 : ['d'].length === 1 이므로 조건 충족, 'd' 포함
3. 첫 번째 filter 결과 ['c', 'd']
4. sort로 정렬
5. join('')으로 배열을 하나의 문자열로 변환 : "cd"