알고리즘
프로그래머스 [Lv. 1] 가장 많이 받은 선물 {언어 : JavaScript}
스위태니
2024. 3. 31. 03:16
728x90
문제 링크
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;
}
풀이 방법
- 우선 친구들의 이름을 인덱스 번호로 만들어서 object에 넣는다.
- 친구 이름(key)을 사용하여 인덱스 번호(value)를 가져온다.
- dp를 3차원 배열로 만든다.
- 1차원은 친구 i를 나타낸다.
- 2차원은 i가 j와의 관계를 나타낸다.
- 3차원은 i와 j가 주고받은 선물과 주고 받았는지를 나타낸다.
- gits를 가지고 i와 j가 서로 선물을 주고 받는다.
- gi가 선물을 준 친구, ti가 선물을 받은 친구
- 선물을 준 친구는
- ti의 관계에서 + 1
- 선물을 주고 받았는지 1
- 선물지수 + 1
- 선물을 받은 친구는
- gi의 관계에서 - 1
- 선물을 주고 받았는지 1
- 선물지수 - 1
- 이제 반복문을 통해 확인한다.
- i == j이면 동일 인물이므로 넘어간다.
- 주고 받았는지 확인한다.
- 주고 받았다면
- 선물을 더 줬는지 확인한다.
- 선물을 더 줬다면 다음달에 선물을 하나 더 받아야 하므로 result의 i번째 인덱스에 + 1
- 선물을 준 갯수가 똑같다면 선물지수를 확인한다.
- 선물지수가 j보다 많다면 선물을 하나 더 받아야 하므로 result의 i번째 인덱스에 + 1
- 선물을 더 줬는지 확인한다.
- 주고 받지 않았다면
- 선물지수를 확인하고 많다면 선물을 하나 더 받아야 하므로 result의 i번째 인덱스에 + 1
- 주고 받았다면
- 이제 result 값 중 최대 값을 answer에 넣고 출력한다.
느낀점
- 이게 레벨 1이라고? ㅋㅋㅋㅋ 요즘 레벨 1의 수준이 올라간 것 같다.
728x90