본문 바로가기
코딩 생활/코딩테스트

[프로그래머스 | JS] 레벨 0. 중복된 문자 제거 (feat. Set 객체)

by everyhahaha 2023. 4. 12.

문제를 풀수록 배열에 대한 메서드나 반복문에 대한 이해도가 높아지는 장점과 동시에

다른 방법으로도 푸는 방법을 공부하고 싶어 다른 분들이 푸는 풀이를 꼭 참고한다.

그러다 개념만 배우고 저만치 멀리 두고있던  Set 으로 된 풀이를 보고

이번 기회에 다시 복습하고자 글을 쓰고자 한다.

 


❓ 문제: 점의 위치 구하기

// 문제 설명
문자열 my_string이 매개변수로 주어집니다. 
my_string에서 중복된 문자를 제거하고 하나의 문자만 남긴 문자열을 return하도록 solution 함수를 완성해주세요.

// 제한사항
1. 1 ≤ my_string ≤ 110
2. my_string은 대문자, 소문자, 공백으로 구성되어 있습니다.
3. 대문자와 소문자를 구분합니다.
4. 공백(" ")도 하나의 문자로 구분합니다.
5. 중복된 문자 중 가장 앞에 있는 문자를 남깁니다.

📝 문제 풀이

function solution(my_string) {
    let arr = [];
    
    // 문자열을 순회하면서 배열에 추가.
    for (const str of my_string) {
        if (!arr.includes(str)) arr.push(str);
    }
    
    return arr.join("");
}

문자열 그대로 배열로 만들고 메서드로 풀까 고민하다가

개인적으로 가독성이 좋다고 생각하는 for of 반복문으로 풀었다.

function solution(my_string) {
    return [...new Set(my_string)].join('');
}

다른 분들의 풀이를 보다가 생각치도 못한  Set 을 보고 이번 기회에 다시 확실히 공부하고 넘어가고자 한다.


🔍 더 파고들기 - Set 객체

Set 객체는 ES6에 추가된 문법으로,

중복되지 않는 요소들을 쉽게 관리하기 위해 Set 객체가 탄생했다.

물론 기존 배열 문법에서도 중복을 제거하거나 방지 가능했지만 비효율적이었다.

기존의 배열과 Set을 비교해보자.

 

Array와 Set 비교

  Array Set
유형 참조형 데이터 타입 객체
속도 더 느림 더 빠름
순서 요소 순서 중요
→ 인덱스로 접근
순서 보장 X
인덱스로 접근 불가능. iterator 사용
중복 중복된 요소 허용 중복된 요소 허용 X
동일한 값을 또 추가할 경우 하나의 값만 저장된다
길이 파악  length()  메소드 사용
→ 리턴값: 배열의 길이
 size  속성 사용
→ 리턴값: Set 객체의 원소 수
값 확인  includes()  메서드 사용
→ 리턴값: true || false
 has()  메서드 사용
→ 리턴값: true || false

둘이 비슷하면서 은근히 다르다.

그럼 이번엔 List, Map과 비교해보자.

 

 

List / Map / Set 비교

출처 : https://xzio.tistory.com/1828

  List Map Set
유형 순서가 있는 데이터의 집합 객체와 유사한 순회가능한 객체 배열과 유사한 순회가능한 객체
형태   Key-Value  
용도 순서가 있는 데이터를 저장하는 자료구조 Key와 Value을 연결해 저장하는 자료구조 중복되지 않는 값을 저장하는 자료구조
순서 순서 보장
→ 인덱스로 접근
순서 보장 X
 인덱스 X, iterator 사용
순서 보장 X
 인덱스 X, iterator 사용
중복 중복 허용 Key값 중복 허용 X
Value값은 중복 가능
모든 값 중복 허용 X
(중복된 값 들어오면 자동으로 삭제)
접근 인덱스로 접근 Key값으로 접근
( get()  메서드 사용)
값으로 접근
(정확히는  forEach()  메서드로 순회해서 접근)
장점 크기 가변적 빠른 검색속도 빠른 검색속도

Map Set은 값이 들어오면 내부적으로는 해시 함수를 사용해서 고유한 해시값(Hash Value)로 변환해서 저장한다.

즉, 내부적으로 해시 테이블(Hash Table)을사용하기 때문에 중복을 방지할 수 있다.

List는 자바스크립트에 없는 자료구조(Java에는 존재)이지만 배열을 이용해서 구현 가능하다.


이제 코드로 확인해보자.

배열을 이용한 코드가 따로 변수를 선언한 이유도 있겠지만

Set 객체를 이용한 풀이가 대체적으로 빠르다.

배열(왼쪽)과 Set 객체(오른쪽)를 이용한 풀이 비교

 

 

지금까지는 메서드가 훨씬 많은 배열을 두고 굳이 Set을 써야하나 했는데,

상황에 맞게 적극적으로 활용해야겠다는 생각이 들었다.

 

수정이 필요한 내용이 있다면 언제든 알려주세요 :-)

그럼 모두 즐코하세요-!

댓글