숫자 범위를 확인하고 그냥 냅다 돌려보는 연습을 해보자
function solution(test) {
const M = arr.length;
const N = arr[0].length;
let list = [];
// i : 멘토
for (let i = 1; i <= N; i++) {
// j : 멘티
for (let j = 1; j <= N; j++) {
if (i === j) continue;
let flag = true;
// 각 M번의 시험
for (let k = 0; k < M; k++) {
let pi, pj; // i, j의 등수
// 각 시험에서 N명의 학생들
for (let l = 0; l < N; l++) {
if (arr[k][l] === i) pi = l + 1;
else if (arr[k][l] === j) pj = l + 1;
}
if (pi < pj) flag = false;
}
// M번의 시험 모두 pi > pj 이면 해당 Case를 count
for (x of list) {
if (x === [i, j] || x.reverse() === [i, j]) continue;
}
// flag가 true이면 모든 검증을 통과한 것
if (flag) list.push([i, j]);
}
}
console.log(list);
answer = list.length;
return answer;
}
let arr = [
[3, 4, 1, 2],
[4, 3, 2, 1],
[3, 1, 4, 2]
];
console.log(solution(arr));
function solution(test) {
let answer = 0;
m = test.length;
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));
내 풀이와 다른 점
- flag 대신 cnt 변수 사용 (flag가 좀 더 직관적인 것 같음)
- 굳이 list를 만들 필요 없이 answer 카운팅만 했으면 됨
(나도 answer 카운팅만 했지만 로그를 찍기 위해 list 만들었음)- 굳이 (1, 3) vs (3, 1) 을 비교하는 과정을 넣을 필요가 없었음
문제를 풀면서 막혔던 점
- flag를 만들지 않아서 많이 헤맸다.
( pi < pj 면 break를 하게끔 해놔서 break 후 전부 카운팅이 됐었음)- 등수가 더 높다는게 등수 숫자가 더 작다는 것인데 이걸 헷갈려서 부등호 방향을 반대로 했었다.