본문 바로가기
Algorithms/코테 문풀

[프로그래머스] 한 번만 등장한 문자 - JavaScript 풀이 / 배열에서 [빈 값, undefined, null] 제거하기

by hi-rachel 2023. 1. 4.

 

✏️ 문제 설명

문자열 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() 메서드를 사용했다.

 

[프로그래머스] 369 문제 - JavaScript 풀이

✏️ 문제 설명 머쓱이는 친구들과 369게임을 하고 있습니다. 369게임은 1부터 숫자를 하나씩 대며 3, 6, 9가 들어가는 숫자는 숫자 대신 3, 6, 9의 개수만큼 박수를 치는 게임입니다. 머쓱이가 말해

hi-rachel.tistory.com

 

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 - 배열의 특정 요소 삭제 방법

JavaScript - 배열에서 빈 값, undefined, null 제거하기

프로그래머스

 

 

😃 공부하면서 적는 글입니다. 잘못된 점이 있다면 피드백 남겨주시면 감사합니다.