코딩 테스트/프로그래머스 코딩 테스트 연습
[JS] 순위
58청춘
2024. 11. 28. 13:53
728x90
문제
풀이
이 문제는 논리적 접근이 필요하다.
순위를 알려면 해당 선수의 각기 다른 상대의 승패 여부를 알아야 한다.
즉, 전체 n명의 선수가 있고 특정 인원의 순위를 알고 싶다면 n-1의 전적이 필요하다.
이를 검증하기 위해서는 주어지는 전적들을 순회하며 각 선수의 승패 여부를 기록한다.
그리고 특정 인원(A)에게 패배한 선수(B)는 A가 패배한 선수들(C)에게는 항상 진다고 되어있다.
이는 다음 사진에서 확인할 수 있다.
그렇다면 B는 항상 C에게 진다는 것을 염두하고 각 선수들의 승패를 기록하는 방식으로 접근하면 된다.
코드
const solution = (n, results) => {
const fight = Array.from({ length: n }, () => Array.from({ length: n }, () => undefined));
let answer = 0;
results.forEach(([a, b]) => {
fight[a - 1][b - 1] = [b - 1, 1];
fight[b - 1][a - 1] = [a - 1, -1];
});
for (let i = 0; i < n; i++) {
const lose = [];
const win = [];
for (let j = 0; j < n; j++) {
if (!fight[i][j]) continue;
else if (fight[i][j][1] === 1) {
win.push(fight[i][j][0]);
}
else if (fight[i][j][1] === -1) {
lose.push(fight[i][j][0]);
}
}
win.forEach(w => {
lose.forEach(l => {
fight[w][l] = [l, -1];
fight[l][w] = [w, 1];
});
});
}
fight.forEach(e => {
if (e.filter(el => el !== undefined).length === n - 1) answer++;
})
return answer;
};
728x90