✏️ 문제 설명
문자열 s가 매개변수로 주어집니다. s에서 한 번만 등장하는 문자를 사전 순으로 정렬한 문자열을 return 하도록 solution 함수를 완성해보세요. 한 번만 등장하는 문자가 없을 경우 빈 문자열을 return 합니다.
제한사항
- 0 < s의 길이 < 1,000
- s는 소문자로만 이루어져 있습니다.
입출력 예
s | result |
"abcabcadc" | "d" |
"abdc" | "abcd" |
"hello" | "eho" |
입출력 예 설명
입출력 예 #1
- "abcabcadc"에서 하나만 등장하는 문자는 "d"입니다.
입출력 예 #2
- "abdc"에서 모든 문자가 한 번씩 등장하므로 사전 순으로 정렬한 "abcd"를 return 합니다.
입출력 예 #3
- "hello"에서 한 번씩 등장한 문자는 "heo"이고 이를 사전 순으로 정렬한 "eho"를 return 합니다.
✏️ 문제 풀이
- 내 풀이
function solution(s) {
const arr = s.split('').sort();
let removeS = [];
for (let i = arr.length; i >= 0; i--) {
if (arr[i] === arr[i-1]) {
removeS.push(arr[i]);
}
if (removeS.some(n => arr[i].includes(n))) {
delete arr[i];
}
}
let onlyOne = arr.filter((element) => element !== undefined);
return onlyOne.join('').toString();
}
2023.01.04 - [코테 문풀] - [프로그래머스] 369 문제 - JavaScript 풀이에서 썼던 some(), includes() 메서드를 사용했다.
Set로 금방 중복되는 값을 찾을 수는 있지만 딱 한 번만 등장한 문자만 남기는 방법을 생각하는데 오래 걸렸다.
일단 arr 값을 하나씩 비교해 중복되는 값을 removeS에 넣어주고 arr에 있는 값이 removeS 값과 겹치면 delete 해주었다.
delete 해주면 그 자리에 null 값이 남기 때문에 이를 없애기 위해 filter를 활용했다.
<배열에서 빈 값, undefined, null 제거하기>
// 1. undefined 제거
let onlyOne = arr.filter((element) => element !== undefined);
// 2. null 제거
let onlyOne = arr.filter((element) => element !== null);
// 3. 빈 요소 제거
let onlyOne = arr.filter(() => true);
// 4. 빈 문자열 제거
let onlyOne = arr.filter((element) => {
return element !== undefined && element !== null && element !== '';
});
위 문제에서는 위 4가지를 모두 써도 같은 값이 나오지만 3번이 제일 간단해보인다.
- 다른 풀이
function solution(s) {
let res = [];
for (let c of s) if (s.indexOf(c) === s.lastIndexOf(c)) res.push(c);
return res.sort().join('');
}
정말 간단하다..!
s의 각 문자열의 (첫번째 index와 마지막 index가 같다면) 그 값이 한 번만 등장한 문자!
s = "hello" 예시의 index를 보면
indexOf()는 지정된 요소에서 찾을 수 있는 첫 번째 인덱스를 반환한다.
반대로 lastIndexOf()는 지정된 요소에서 찾을 수 있는 마지막 인덱스를 반환하기 때문에 indexOf()의 index와 비교하면 중복되는 값의 index가 다르다!
예시 | h | e | l | l | o |
indexOf | 0 | 1 | 2 | 2 | 4 |
lastIndexOf | 0 | 1 | 3 | 3 | 4 |
발상 대단하다 👍🏻
[참고] indexOf(), lastIndexOf()
▶ Array.prototype.indexOf()
indexOf() 메서드는 배열에서 지정된 요소를 찾을 수 있는 첫 번째 인덱스를 반환하거나, 없는 경우 -1을 반환한다.
// https:// developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf
const beasts = ['ant', 'bison', 'camel', 'duck', 'bison'];
console.log(beasts.indexOf('bison'));
// expected output: 1
// Start from index 2
console.log(beasts.indexOf('bison', 2));
// expected output: 4
console.log(beasts.indexOf('giraffe'));
// expected output: -1
// indexOf() Syntax
indexOf(searchElement)
indexOf(searchElement, fromIndex)
▶ Array.prototype.lastIndexOf()
lastIndexOf() 메서드는 하나의 인수(검색할 하위 문자열)가 주어지면 전체 호출 문자열을 검색하고, 지정된 하위 문자열이 마지막으로 나타나는 인덱스를 반환합니다. 두 번째 인수인 숫자가 주어지면 메서드는 지정된 숫자보다 작거나 같은 인덱스에서 지정된 하위 문자열의 마지막 항목을 반환합니다.
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/lastIndexOf
const paragraph = 'The quick brown fox jumps over the lazy dog. If the dog barked, was it really lazy?';
const searchTerm = 'dog';
console.log(`The index of the first "${searchTerm}" from the end is ${paragraph.lastIndexOf(searchTerm)}`);
// expected output: "The index of the first "dog" from the end is 52"
// lastIndexOf() Syntax
lastIndexOf(searchString)
lastIndexOf(searchString, position)
참고사이트
JavaScript - 배열에서 빈 값, undefined, null 제거하기
프로그래머스
😃 공부하면서 적는 글입니다. 잘못된 점이 있다면 피드백 남겨주시면 감사합니다.
'Algorithms > 코테 문풀' 카테고리의 다른 글
[프로그래머스] 7의 개수 - JavaScript / map(), includes(), join(), filter() (0) | 2023.01.08 |
---|---|
[프로그래머스] 자릿수 더하기 - JavaScript / reduce()에 대해 이해해보자! (0) | 2023.01.06 |
[프로그래머스] 영어가 싫어요 - JavaScript 풀이/ 문자열을 숫자로 바꾸는 3가지 방법 (0) | 2023.01.04 |
[프로그래머스] 369 문제 - JavaScript 풀이 (0) | 2023.01.04 |
[1316] 그룹 단어 체커 - Python 문풀 / sorted (0) | 2022.11.04 |