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
'코딩 테스트 > 프로그래머스 코딩 테스트 연습' 카테고리의 다른 글
[JS] 인사고과 (0) | 2024.12.04 |
---|---|
[JS] 합승 택시 요금 (0) | 2024.12.02 |
[JS] 풍선 터트리기 (0) | 2024.11.27 |
[JS] [PCCP 기출문제] 1번 / 동영상 재생기 (0) | 2024.11.26 |
[JS] 다단계 칫솔 판매 (0) | 2024.11.12 |