Lv3. 순위 Javascript
https://programmers.co.kr/learn/courses/30/lessons/49191
function solution(n, rs) {
const gWin = rs.reduce((g, [win, lose]) => {
g[win] = (g[win] || []).concat(lose);
return g;
}, {});
const gLose = rs.reduce((g, [win, lose]) => {
g[lose] = (g[lose] || []).concat(win);
return g;
}, {});
const count = new Array(n).fill(0)
for (let i = 1; i <= n; i++) {
const q = []
const winVisited = new Array(n).fill(false)
q.push(i)
while (q.length) {
const v = q.shift()
if (gWin[v]) {
gWin[v].forEach(item => {
if (!winVisited[item - 1]) {
q.push(item)
winVisited[item - 1] = true
count[i - 1]++;
}
})
}
}
const p = []
const loseVisited = new Array(n).fill(false)
p.push(i)
while (p.length) {
const v = p.shift()
if (gLose[v]) {
gLose[v].forEach(item => {
if (!loseVisited[item - 1]) {
p.push(item)
loseVisited[item - 1] = true
count[i - 1]++;
}
})
}
}
}
return count.filter(v => v == n - 1).length
}
function solution(n, rs) {
const gWin = rs.reduce((g, [win, lose]) => {
g[win] = (g[win] || []).concat(lose);
return g;
}, {});
// gWin : { 1: [2], 2: [5], 3: [2], 4: [3, 2] }
const gLose = rs.reduce((g, [win, lose]) => {
g[lose] = (g[lose] || []).concat(win);
return g;
}, {});
// gLose: { 2: [4, 3, 1], 3: [4], 5: [2] }
const count = new Array(n).fill(0)
// 모든 node가 이어져있지 않기 때문에 for문을 통해 초기값을 설정해줌(1~5)
for (let i = 1; i <= n; i++) {
const q = [] // win queue
const winVisited = new Array(n).fill(false) // win visited
q.push(i)
while (q.length) {
const v = q.shift()
if (gWin[v]) { // gWin[v]가 없을 경우 forEach에서 나는 에러를 방지
gWin[v].forEach(item => {
// winVisited, count는 array로 index가 0부터 시작하기 때문에 -1을 해야함
if (!winVisited[item - 1]) { // 방문한 적이 없을 경우
q.push(item) // queue에 push
winVisited[item - 1] = true // 방문 체크
count[i - 1]++; // count++
}
})
}
}
// 위와 같은 방식으로 count
const p = [] // lose queue
const loseVisited = new Array(n).fill(false) // lose visited
p.push(i)
while (p.length) {
const v = p.shift()
if (gLose[v]) {
gLose[v].forEach(item => {
if (!loseVisited[item - 1]) {
p.push(item)
loseVisited[item - 1] = true
count[i - 1]++;
}
})
}
}
}
// count : [2, 4, 3, 3, 4]
// 본인의 순위를 안다는 것 = 모든 상대방과의 경기에서 이길지 질지를 안다는 것
// 총 인원(n) = 5, 본인을 제외해야하기 때문에 -1 = 4
// count가 4인 요소들은 filtering 하면 answer
return count.filter(v => v == n - 1).length
}
i, q, v, item ...
댓글 환영
질문 환영
by.protect-me