우아한테크코스에서는 교육생(이하 크루) 간 소통 시 닉네임을 사용한다. 간혹 비슷한 닉네임을 정하는 경우가 있는데, 이러할 경우 소통할 때 혼란을 불러일으킬 수 있다.
혼란을 막기 위해 크루들의 닉네임 중 같은 글자가 연속적으로 포함 될 경우 해당 닉네임 사용을 제한하려 한다. 이를 위해 같은 글자가 연속적으로 포함되는 닉네임을 신청한 크루들에게 알려주는 시스템을 만들려고 한다.
신청받은 닉네임 중 같은 글자가 연속적으로 포함 되는 닉네임을 작성한 지원자의 이메일 목록을 return 하도록 solution 메서드를 완성하라.
email.com
도메인으로만 제한한다.forms | result |
---|---|
[ ["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)의 배열을 오름차순으로 정렬한다.
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));
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;
}
new Set()
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
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));