커플 찾기

by Sehyun Chung

HTML

<div class="container">
  <form id="match-input">
    <textarea form="match-input" cols="10" rows="3"></textarea>
    <input type="submit">
    <input type="reset">
  </form>
  <div class="answer"></div>
</div>

CSS

body {
  font-size: 1rem;
  font-family: monospace;
  box-sizing: border-box;
}

.container {
  height: 100%;
  width: 320px;
}

textarea {
  width: 100%;
  min-width: 320px;
  height: 240px;
  font-size: 1rem;
  font-family: monospace;
  border-radius: 6px;
  padding: 20px;
  box-sizing: border-box;
  border: 1px solid #ccc;
}

.answer {
  margin: 10px 5px;
  box-sizing: border-box;
}

JavaScript

(function() {
  const input = document.querySelector('textarea');
  const submit = document.querySelector('input[type="submit"]');
  const reset = document.querySelector('input[type="reset"]');
  const answer = document.querySelector('.answer');

  console.log(submit);
  // submit 버튼 동작
  submit.addEventListener('click', e => {
    e.preventDefault();
    if (!input.value) {
      answer.textContent = '입력값이 없습니다.';
      throw '입력값이 없습니다.';
    }
    const inputArr = input.value.split('\n');
    const candidatesNum = parseInt(inputArr[0]);
    const hobbyArr = inputArr.filter((item, index) => index > 0);
    const result = matchChecker(candidatesNum, hobbyArr);
    answer.textContent = result;
  });

  // 리셋 버튼
  reset.addEventListener('click', e => {
    answer.innerHTML = '';
  });

  function matchChecker(n, strs) {
    // 입력된 취미값 문자열을 배열로 바꾼다.
    const strArrs = strs.map(i => i.split(' '));

    // 입력된 대상자 수와 취미값의 수가 다를 경우 에러 메시지를 띄운다.
    if (n !== strArrs.length) {
      answer.textContent = `잘못된 입력입니다.`;
      throw `잘못된 입력입니다.`;
    }

    // 취미값 배열들을 알파벳 순서로 정렬한다.
    const sortedArrs = strArrs.map(item => item.sort());

    // 매치 결과를 저장할 객체를 만든다.
    const resultObj = {};

    // 매치 결과를 (매치 키):(중복 취미 수 밸류)쌍으로 객체에 저장한다.
    for (let i = 0; i < n - 1; i++) {
      for (let j = 1; j < n; j++) {
        if (i !== j && i < j) {
          const key = `${i + 1}-${j + 1}`;
          sortedArrs[i].reduce((obj, item) => {
            if (sortedArrs[j].includes(item)) {
              obj[key] = obj[key] + 1 || 1;
            }
            return obj;
          }, resultObj);
        }
      }
    }

    // 매치 수로 정렬된 키들의 배열을 만든다.
    const sortedKeysArr = Object.keys(resultObj).sort(
      (x, y) => resultObj[y] - resultObj[x]
    );

    // 최대 매치수를 변수에 저장
    const maxMatchNum = resultObj[sortedKeysArr[0]];

    // 최대 매치수와 같은 값을 가진 키들을 결과 배열을 만들어 정렬
    const resultArr = sortedKeysArr
      .filter(i => resultObj[i] === maxMatchNum)
      .sort((x, y) =>...