상현에 하루하루
All 개발자의 하루

모임

( 업데이트: )

JONE은 친구를 초대했습니다. 친구 목록은 다음과 같습니다.

s = "Fred:Corwill;Wilfred:Corwill;Barney:Tornbull;Betty:Tornbull;Bjon:Tornbull;Raphael:Corwill;Alfred:Corwill";

이 목록을 가지고 아래 조건을 통해서 리스트를 만들어야 합니다.

  • 문자열은 모두 대문자로 변경
  • 알파벳 순으로 정렬
    – 성이 같은 경우 이름별로 정렬 하십시오.
    – 손님의 성과 이름은 쉼표로 구분 된 괄호 사이에 결과로 나타나야 합니다.

따라서 아래와 같은 리스트로 변환되어야 합니다.

"(CORWILL, ALFRED)(CORWILL, FRED)(CORWILL, RAPHAEL)(CORWILL, WILFRED)(TORNBULL, BARNEY)(TORNBULL, BETTY)(TORNBULL, BJON)"

같은 성을 가진 두명의 서로 다른 가족에서 두 사람도 같은 이름을 가질 수도 있습니다.


[2020-06-24]

function meeting(s) {

  let result = s.toUpperCase().split(';');
  for(let i in result) {
    result[i] = result[i].split(':');
    let first = result[i][0];
    let second = result[i][1];
    result[i][0] = second;
    result[i][1] = first;
  }
  
  result = result.sort((a, b) => {
    
    if (a[0] === b[0]) {
      const a_namefirstLetter = a[1];
      const b_namefirstLetter = b[1];
      if (a_namefirstLetter > b_namefirstLetter) return 1;
      if (a_namefirstLetter < b_namefirstLetter) return -1;
      return 0;
    }

    if (a[0] > b[0]) return 1;
    if (a[0] < b[0]) return -1;
    return 0;
  });
  
  for(let i in result) {
    result[i] = `(${result[i].join(', ')})`;
  }
  return result.join('');
}

;로 구분된 문자열을 배열로 변경해서 이름으로 구분합니다.

이름을 구분해서 내부의 : 문자를 기준으로 쉼표로 구분되는 이름을 만들어줍니다. 그리고 해당 배열로 sort를 통해서 정렬을합니다.

정렬할때 성이 같으면 이름으로 정렬하는 것으로 구성합니다.

string타입은 정렬할때 모든 문자열을 기준으로 정렬하는지 몰라서 sort 메소드 내부에서 여러 기준을 정해준 것같다.

Best 답변을보면

function meeting(s) {
  let string = s.toUpperCase().split(';')
                .map(x => x.split(':').reverse().join(', '))
                .sort()
                .join(')(')
  return '(' + string + ')'
}

이렇게 구성되어있는데 sort()에서 따로 조건을 걸어주지 않아도 되는 것을 보고선 알게 되었다.

배열을 정렬하는 메소드를 그렇게 많이 활용해 보지 않아서 생긴 문제였다.

코드의 길이를 보면 너무나도 많은 차이를 보여준다.