58청춘 2024. 11. 28. 13:53
728x90

문제

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

 

풀이

이 문제는 논리적 접근이 필요하다.

 

순위를 알려면 해당 선수의 각기 다른 상대의 승패 여부를 알아야 한다.

즉, 전체 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