커플 찾기
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) =>...