[우테코 프리코스] 중복 닉네임 찾기

지원·2022년 11월 6일
0
post-thumbnail

🚀 기능 요구 사항

우아한테크코스에서는 교육생(이하 크루) 간 소통 시 닉네임을 사용한다. 간혹 비슷한 닉네임을 정하는 경우가 있는데, 이러할 경우 소통할 때 혼란을 불러일으킬 수 있다.

혼란을 막기 위해 크루들의 닉네임 중 같은 글자가 연속적으로 포함 될 경우 해당 닉네임 사용을 제한하려 한다. 이를 위해 같은 글자가 연속적으로 포함되는 닉네임을 신청한 크루들에게 알려주는 시스템을 만들려고 한다.

신청받은 닉네임 중 같은 글자가 연속적으로 포함 되는 닉네임을 작성한 지원자의 이메일 목록을 return 하도록 solution 메서드를 완성하라.

제한사항

  • 두 글자 이상의 문자가 연속적으로 순서에 맞추어 포함되어 있는 경우 중복으로 간주한다.
  • 크루는 1명 이상 10,000명 이하이다.
  • 이메일은 이메일 형식에 부합하며, 전체 길이는 11자 이상 20자 미만이다.
  • 신청할 수 있는 이메일은 email.com 도메인으로만 제한한다.
  • 닉네임은 한글만 가능하고 전체 길이는 1자 이상 20자 미만이다.
  • result는 이메일에 해당하는 부분의 문자열을 오름차순으로 정렬하고 중복은 제거한다.

실행 결과 예시

formsresult
[ ["jm@email.com", "제이엠"], ["jason@email.com", "제이슨"], ["woniee@email.com", "워니"], ["mj@email.com", "엠제이"], ["nowm@email.com", "이제엠"] ]["jason@email.com", "jm@email.com", "mj@email.com"]

기능 구현 단계

단계 1) nickname 배열과, email 배열을 분리해서 만들기 
단계 2) for문으로 nickname 배열을 돌리고, 
단계 3) nickaname이 중복된 배열 요소들을 빈 배열에 push해서 모은다.
단계 4) 단계 3)의 배열의 중복을 제거한다.
단계 5) 단계 4)의 닉네임의 index값을 찾아 indexArr를 만든다.
단계 6) indexArr를 map하여 emailArr의 index값으로 요소로 대체한다.
단계 7) 단계 6)의 배열을 오름차순으로 정렬한다.

기능 구현 과정

단계 1) nickname 배열과, email 배열을 분리해서 만들기

    const nickNameArr = forms.map((el) => el[1]);
    const emailArr = forms.map((el) => el[0]);

단계 2) for문으로 nickname 배열을 순회하면서, 각각의 배열의 요소의 길이만큼 for문으로 2글자 연속 중복된 값을 찾는다.

단계 3) nickaname이 중복된 배열 요소들을 빈 배열에 push해서 모은다.

    let duplicated;
    let duplicatedMemberNames = [];

    for (let i = 0; i < nickNameArr.length; i++) {
        for (j = 0; j < nickNameArr[i].length - 1; j++) {
            duplicated = nickNameArr.filter((el) =>
                el.includes(nickNameArr[i][j] + nickNameArr[i][j + 1])
            );
            if (duplicated.length > 1) {
                duplicatedMemberNames.push(...duplicated);
            }
        }

단계 4) 단계 3)의 배열의 중복을 제거한다.

        const set = new Set(duplicatedMemberNames);
        const filtered = [...set];

단계 5) 단계 4)의 닉네임의 index값을 찾아 indexArr를 만든다.

        const indexArr = filtered.map((el) => nickNameArr.indexOf(el));

단계 6) indexArr를 map하여 emailArr의 index값으로 요소로 대체한다.

단계 7) 단계 6)의 배열을 오름차순으로 정렬한다.

        answer = indexArr
            .map((el) => emailArr[el])
            .sort((a, b) => (a < b ? -1 : a == b ? 0 : 1));

전체 코드

function problem6(forms) {
    var answer;
    const nickNameArr = forms.map((el) => el[1]);
    const emailArr = forms.map((el) => el[0]);

    let duplicated;
    let duplicatedMemberNames = [];

    for (let i = 0; i < nickNameArr.length; i++) {
        for (j = 0; j < nickNameArr[i].length - 1; j++) {
            duplicated = nickNameArr.filter((el) =>
                el.includes(nickNameArr[i][j] + nickNameArr[i][j + 1])
            );
            if (duplicated.length > 1) {
                duplicatedMemberNames.push(...duplicated);
            }
        }

        const set = new Set(duplicatedMemberNames);
        const filtered = [...set];
        const indexArr = filtered.map((el) => nickNameArr.indexOf(el));
        answer = indexArr
            .map((el) => emailArr[el])
            .sort((a, b) => (a < b ? -1 : a == b ? 0 : 1));
    }

    return answer;
}

새로 알게 된 것

1) 중복 제거를 위한 new Set()

  • JavaScript 에서 ES6 에 생긴 Set 을 사용하면 배열의 중복을 제거할 수 있다.
  • set을 사용하지 않고 중복을 제거 하는 방법으로는 filter(), indexOf()를 사용하는 방법이 있다.
const arr = ['A', 'B', 'C', 'A', 'B'];

const set = new Set(arr);
const newArr = [...set];
console.log(newArr) // ['A','B','C']

set 관련 공식문서
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Set

2) 알파벳 오름차순 정렬하는 방법

  • sort()함수를 사용하여 정렬
  • Sort()는 기본적으로 유니코드값으로 정렬하기 때문에 뒤에 비교함수를 넣어주어야 한다.

    정렬 원리

    반환 값 < 0 : a가 b보다 앞에 있어야 한다.
    반환 값 = 0 : a와 b의 순서를 바꾸지 않는다.
    반환 값 > 0 : b가 a보다 앞에 있어야 한다.

// sort() 공식 문서 내용
function compare(a, b) {
  if (a is less than b by some ordering criterion) {
    return -1;
  }
  if (a is greater than b by the ordering criterion) {
    return 1;
  }
  // a must be equal to b
  return 0;
}
  • 공식문서의 내용을 참고하여, 중첩 삼항연산자를 사용하여 아래와 같이 표현해보았다.
   indexArr.sort((a, b) => (a < b ? -1 : a == b ? 0 : 1));

느낀점

  • 처음 6번 문제를 보았을 때에는 너무 복잡해보이고, 풀 수 없을 것 같다는 생각이 들었다. 하지만, 단계를 차근 차근 정하고, 필요한 method들을 알아보면서 해결할 수 있었다. 특히 배열에서의 중복 제거방법이나, 알파벳을 오름차순으로 정렬하는 것은 현업에서 데이터를 관리할 때에도 유용하게 사용될 것 같다.
profile
안녕하세요 지원입니다.

0개의 댓글