[programmers] Lv3. 순위 ​Javascript | 그래프 | protect-me

protect-me·2021년 8월 11일
0
post-thumbnail

🕊 Link

Lv3. 순위 Javascript
https://programmers.co.kr/learn/courses/30/lessons/49191

🧑🏻‍💻 Code(javascript)

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
}

💡 Solution

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
}

👨🏻‍💻💭 Self Feedback

  • 중간에 변수를 헷갈리지 않고 정확하게 사용하는 것이 중요... i, q, v, item ...
  • 중간중간에 적절하게 console을 찍어보고 확실하게 넘어가자.

  • 2021.08.11 - 최초 작성

댓글 환영 질문 환영
by.protect-me

profile
protect me from what i want

0개의 댓글