몸과 마음이 건전한 SW 개발자

프로그래머스 [Lv. 1] 가장 많이 받은 선물 {언어 : JavaScript} 본문

알고리즘

프로그래머스 [Lv. 1] 가장 많이 받은 선물 {언어 : JavaScript}

스위태니 2024. 3. 31. 03:16

문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/258712

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

정답 코드

function solution(friends, gifts) {
    const n = friends.length;
    const dictFriends = {};
    // n번째 인덱스가 선물지수
    let dp = Array(n).fill().map(() => Array(n+1).fill().map(() => [0, 0]));
    friends.forEach((f, i) => {
       dictFriends[f] = i;
    });
    gifts.forEach((gt) => {
        const [g, t] = gt.split(" ");
        const gi = dictFriends[g];
        const ti = dictFriends[t];
        dp[gi][ti][0] += 1;
        dp[gi][ti][1] = 1;
        dp[gi][n][0] += 1;
        dp[ti][gi][0] -= 1;
        dp[ti][gi][1] = 1;
        dp[ti][n][0] -= 1;
    })
    let result = Array(n).fill().map(() => 0);
    for (let i = 0; i < n; i++) {
        let cnt = 0;
        // i의 선물지수
        const ie = dp[i][n][0];
        for (let j = 0; j < n; j++) {
            if (i == j) {
                continue;
            };
            // j의 선물지수
            const je = dp[j][n][0];
            
            // 주고 받았는지 확인
            if (dp[i][j][1]) {
                // 주고 받았다면 양수인지 확인
                if (dp[i][j][0] > 0) {
                    // 준 것이 많기 때문에 양수
                    result[i] += 1;
                } else if (dp[i][j][0] == 0) {
                    if (ie > je) {
                        result[i] += 1;
                    };
                };
            } else {
                // 주고 받지 않았다면 서로의 선물 지수 확인
                if (ie > je) {
                    result[i] += 1;
                };
            };
        };
    };
    const answer = Math.max(...result);
    return answer;
}

풀이 방법

  1. 우선 친구들의 이름을 인덱스 번호로 만들어서 object에 넣는다.
  2. 친구 이름(key)을 사용하여 인덱스 번호(value)를 가져온다.
  3. dp를 3차원 배열로 만든다.
    1. 1차원은 친구 i를 나타낸다.
    2. 2차원은 i가 j와의 관계를 나타낸다.
    3. 3차원은 i와 j가 주고받은 선물과 주고 받았는지를 나타낸다.
  4. gits를 가지고 i와 j가 서로 선물을 주고 받는다.
    1. gi가 선물을 준 친구, ti가 선물을 받은 친구
    2. 선물을 준 친구는
      1. ti의 관계에서 + 1
      2. 선물을 주고 받았는지 1
      3. 선물지수 + 1
    3. 선물을 받은 친구는
      1. gi의 관계에서 - 1 
      2. 선물을 주고 받았는지 1
      3. 선물지수 - 1
  5. 이제 반복문을 통해 확인한다.
    1. i == j이면 동일 인물이므로 넘어간다.
    2. 주고 받았는지 확인한다.
      1. 주고 받았다면
        1. 선물을 더 줬는지 확인한다.
          1. 선물을 더 줬다면 다음달에 선물을 하나 더 받아야 하므로 result의 i번째 인덱스에 + 1
        2. 선물을 준 갯수가 똑같다면 선물지수를 확인한다.
          1. 선물지수가 j보다 많다면 선물을 하나 더 받아야 하므로 result의 i번째 인덱스에 + 1
      2. 주고 받지 않았다면
        1. 선물지수를 확인하고 많다면 선물을 하나 더 받아야 하므로 result의 i번째 인덱스에 + 1
  6. 이제 result 값 중 최대 값을 answer에 넣고 출력한다.

느낀점

  • 이게 레벨 1이라고? ㅋㅋㅋㅋ 요즘 레벨 1의 수준이 올라간 것 같다.