Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- Lv. 0
- 소프티어
- 깊이 우선 탐색
- Lv. 3
- Lv. 2
- 동적계획법
- Dynamic Programming
- javascript
- Lv. 1
- 너비 우선 탐색
- SQL
- Java
- Python
- 파이썬
- C언어
- level 3
- select
- 티스토리챌린지
- bfs
- programmers
- dfs
- LEVEL 2
- softeer
- SQL 고득점 KIT
- 프로그래머스
- DP
- 자바스크립트
- join
- 오블완
- group by
Archives
- Today
- Total
몸과 마음이 건전한 SW 개발자
프로그래머스 [Lv. 1] 가장 많이 받은 선물 {언어 : JavaScript} 본문
문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/258712
정답 코드
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의 수준이 올라간 것 같다.
'알고리즘' 카테고리의 다른 글
프로그래머스 [Lv. 2] 요격 시스템 {언어 : JavaScript} [2024.04.16 수정, 반례 추가] (0) | 2024.04.02 |
---|---|
프로그래머스 [Lv. 1] 달리기 경주 {언어 : JavaScript} (0) | 2024.04.01 |
프로그래머스 [Lv. 1] [PCCP 기출문제] 1번 / 붕대 감기 {언어 : Python} (0) | 2024.03.30 |
프로그래머스 [Lv. 3] 주사위 고르기 {언어 : JavaScript} (1) | 2024.03.29 |
프로그래머스 [Lv. 2] 석유 시추 {언어 : JavaScript} (0) | 2024.03.28 |