해당 포스팅은 인프런의 "자바스크립트 알고리즘 문제풀이" 강의 중 챕터4의 멘토링 문제 풀이를 다룬다. 완전탐색으로 풀이하였다.
INPUT:
반 학생 수(N)
시험 횟수(M)
테스트 결과
OUTPUT: 짝을 만들 수 있는 총 경우의 수
(멘토-멘티) 짝이 되기 위해서는 모든 테스트에 대해 멘토가 멘티보다 앞에 있어야 한다.
이는 모든 테스트 결과에서 멘토 index가 멘티 index보다 더 작아야 한다는 의미이다.
모든 순서쌍([멘토, 멘티]
을 만든 다음,모든 테스트에서 멘토-멘티 순서가 뒤바뀌지 않는다면 총 경우를 +1
해준다. 가능한 모든 멘토-멘티 순서쌍은 4 * 4 = 16쌍이다.
[1,1], [1,2], [1,3], [1,4]
[2,1], [2,2], [2,3], [2,4]
[3,1], [3,2], [3,3], [3,4]
[4,1], [4,2], [4,3], [4,4]
이 때 [1,1] 처럼 멘토, 멘티 학생이 겹치는 경우가 있다.
이를 처리하기 위해 멘토 index ≥ 멘티 index
로 순서를 비교해주자!
function solution(arr) {
가능한 순서쌍을 모두 만든다.
cnt = 0;
// ex. [1,2]
for ([prev, next] of 순서쌍) {
isPossible = true;
for (array of arr) {
// arr의 배열들을 돌면서 해당 순서쌍에서 하나라도 순서가 다를시
if (array에서 prev 인덱스 >= next 인덱스) {
isPossible = false;
break;
}
}
// 해당 순서쌍이 모든 경우에서 순서가 맞다면
if (isPossible) ++cnt;
}
return cnt;
}
const input = require('fs').readFileSync('/dev/stdin').toString().split('\n').slice(0, -1);
const [n,m] = input.shift();
const tests = input.map(line => line.split(" ").map(el => Number(el)));
const pair = [];
for (let i=1; i<=n; i++) {
for (let j=1; j<=n; j++) {
pair.push([i,j]);
}
}
let cnt = 0;
for (const [mento, menti] of pair) {
let isPossible = true;
for (const test of tests) {
const mentoIdx = test.indexOf(mento);
const mentiIdx = test.indexOf(menti);
if (mentoIdx >= mentiIdx) {
isPossible = false;
break;
}
}
if (isPossible) cnt++;
}
console.log(cnt)
시간복잡도
:
멘토-멘티 쌍을 (i, j)라고 생각하자.
function solution(test) {
let answer = 0;
const m = test.length;
const n = test[0].length;
for (let i = 1; i <= n; i++) {
for (let j = 1; j <= n; j++) {
let cnt = 0;
for (let k = 0; k < m; k++) {
let pi = pj = 0;
for (let s = 0; s < n; s++) {
if (test[k][s] === i) pi = s;
if (test[k][s] === j) pj = s;
}
if (pi < pj) cnt++;
}
if (cnt === m) answer++;
}
}
return answer;
}
let arr=[[3, 4, 1, 2], [4, 3, 2, 1], [3, 1, 4, 2]];
console.log(solution(arr));