HomeAboutMeBlogGuest
© 2025 Sejin Cha. All rights reserved.
Built with Next.js, deployed on Vercel
👻
개발 기록
/
코딩테스트 스터디
코딩테스트 스터디
/
순위

순위

Link
https://programmers.co.kr/learn/courses/30/lessons/49191
Deadline
Oct 23, 2021
Status
Archived
Type
BFS
Floyd Warshall

📄문제

notion image

✏️풀이

재영
class Queue { constructor() { this.queue = []; this.front = 0; this.rear = 0; } enqueue(val) { this.queue[this.rear] = val; this.rear += 1; } dequeue() { const value = this.queue[this.front]; delete this.queue[this.front]; this.front += 1; return value; } size() { return this.rear - this.front; } } const getDataset = (n, results) => { const winDataset = Array.from({ length: n }, () => new Array(n).fill(false)); const loseDataset = Array.from({ length: n }, () => new Array(n).fill(false)); results.forEach(([winPlayer, losePlayer]) => { winDataset[winPlayer - 1][losePlayer - 1] = true; loseDataset[losePlayer - 1][winPlayer - 1] = true; }); return [winDataset, loseDataset]; }; const getVisitedByDataset = (now, dataset, visited) => { const queue = new Queue(); visited[now] = true; bfs(dataset[now], now); while (queue.size()) { const [winner, loser] = queue.dequeue(); bfs(dataset[loser], winner); } return visited; function bfs(dataset, target) { dataset.forEach((isNext, idx) => { if (isNext && !visited[idx]) { visited[idx] = true; queue.enqueue([target, idx]); } }); } }; const getResult = (n, winDataset, loseDataset) => { let result = 0; const makeVisited = () => Array.from({ length: n }, () => false); for (let now = 0; now < n; now += 1) { const winVisited = getVisitedByDataset(now, winDataset, makeVisited()); const totalVisited = getVisitedByDataset(now, loseDataset, winVisited); result += totalVisited.every((bool) => bool); } return result; }; const solution = (n, results) => { const [winDataset, loseDataset] = getDataset(n, results); const result = getResult(n, winDataset, loseDataset); return result; }; const n = 5; const results = [ [1, 4], [4, 2], [2, 5], [5, 3], ]; console.log(solution(n, results));
은찬
function solution(n, results) { let answer = 0; const graph = Array.from({length: n + 1}, () => Array(n + 1).fill(false)); for(let i = 0; i < results.length; i++){ graph[results[i][0]][results[i][1]] = true; } // 플로이드 와샬 // a -> c : 10 // a -> b : 5 // b -> c : 2 // a -> c 로 바로 가는 것보다 a -> b -> c로 가는 것이 비용이 더 적기 때문에 최적 // i가 k를 이기고, k가 j를 이겼을 때 i는 k와 싸우지 않아도 무조건 k를 이긴다. for(let k = 1; k <= n; k++){ for(let i = 1; i <= n; i++){ for(let j = 1; j <= n; j++){ if(graph[i][k] && graph[k][j]){ graph[i][j] = true; } } } } for(let i = 1; i <= n; i++){ let count = 0; for(let j = 1; j <= n; j++){ if(graph[i][j] || graph[j][i]){ count++; } } if(count === n - 1){ answer++; } } return answer; }
효성
function solution(n, results) { const winSetTable = [...Array(n+1)].map(() => new Set()); const loseSetTable = [...Array(n+1)].map(() => new Set()); const rangeN = [...Array(n)].map((_, idx) => idx+1); results.forEach(ret => { const [winner, loser] = ret; winSetTable[winner].add(loser); loseSetTable[loser].add(winner); }); rangeN.forEach(player => { for(const winner of loseSetTable[player]) { for(const loser of winSetTable[player]) { winSetTable[winner].add(loser); loseSetTable[loser].add(winner); } } }); return rangeN.filter(i => winSetTable[i].size + loseSetTable[i].size === n - 1).length; }