준영이의 성장일기(FrontEnd)
프로그래머스 2024 KAKAO WINTER INTERNSHIP 1번 본문
5월 20일 부터 네이버 부스트캠프 서류 작성이 시작되고 6월 15일에 1차 문제 해결력 테스트가 있다. 프로그래머스로 시험을 치룬다는 얘기를 봤어서 준비해볼 겸 첫 프로그래머스 문제를 공부해보았다.
어떤 걸 공부해볼까 하다가 2024년 KAKAO 겨울 인턴십 코테 1번 문제로 골랐는데 1번부터 벽이 느껴져서 분발해야 겠다는 다짐을 하였다.😂😂 노트에 코드를 분해하고 정독해서 이해를 할 수 있었다.
<문제>
📕프로그래머스 기준 Lv1 문제이고 단순 구현 문제라고는 하지만 접근 조차 하지 못했다..
<문제 핵심>
1. 중첩 객체를 잘 활용할수 있느냐
2. Object.entries 메소드와 forEach문을 잘 이해하고 있나
<풀이방법 및 순서도>
❗❗프로그래머스는 백준과 다르게 따로 입력 구문을 작성하지 않고 기본 함수 틀 안에서 구현을 하면 된다.
1. dstData의 초기화를 진행한다.
✅1차원 배열인 friends 요소를 순회 시작(forEach문 사용)
✅ dstData[outName]을 통해 객체 초기화
✅ 다시 순회를 시작하여 객체 안에 객체가 또 있는 중첩객체를 구현한다.
✅ outerName과 InnerName이 같지 않으면 [0, 0]으로 초기화, 같다면 0으로 초기화
-> [0, 0] = [outerName이 InnerName에게 준 선물 갯수, 받은 갯수]
-> 그냥 0은 선물을 준 횟수를 의미한다.
<중첩객체 예시>
elice: outerName에 해당, elice~chris: innerName에 해당
{
"elice" : {
"elice" : 0,
"Bob" : [0, 1],
"chris" : [2, 1],
}
}
friends.forEach(outerName => {
dstData[outerName] = {};
friends.forEach(innerName => {
if (outerName !== innerName) {
dstData[outerName][innerName] = [0, 0]; // [준 개수, 받은 개수]
} else {
dstData[outerName][innerName] = 0; // 같은 경우 선물 지수 0
}
});
});
2. dstData의 파싱 진행
✅ gifts 또한 1차원 배열("A B"로 구성되어있고 A가 선물을 준 사람, B가 선물을 받은 사람)이고 forEach문으로 순회
✅ 선물 지수와 그리고 누가 누구한테 선물을 몇개 주고 몇개 받았는지 데이터 파싱을 진행
gifts.forEach((gift) => {
let [from, to] = gift.split(" ");
dstData[from][from] += 1; // 선물 준 사람의 선물 지수 증가
dstData[to][to] -= 1; // 선물 받은 사람의 선물 지수 감소
dstData[from][to][0] += 1; // from이 to에게 준 선물 개수 증가
dstData[to][from][1] += 1; // to가 from에게 받은 선물 개수 증가
});
3. 각 친구별로 가장 많은 선물을 받을 친구가 받는 선물의 최대 갯수를 계산
✅ 중첩객체 중 가장 바깥쪽 객체부터 forEach문이 시작되고 tempAnswer를 0으로 초기화 해놓기
-> forEach문 () 안에서 구조분해할당 진행
-> tempAnswer은 어떤 사람이 다음 달에 선물을 받는 갯수를 의미한다.
✅ 안 쪽 객체를 forEach문을 통해 접근하고 from이 to에게 선물을 준 갯수, 받은 갯수를 비교한다
✅ 준 갯수, 받은 갯수가 동일하다면 fromName과 toName에 해당하는 사람 중 선물 지수가 큰 사람이 작은 사람에게 선물을 받는다.
-> 선물 지수 : 자신이 선물을 준 갯수 - 선물을 받은 갯수
Object.entries(dstData).forEach(([fromName, giftDatas]) => {
let tempAnswer = 0;
Object.entries(giftDatas).forEach(([toName, giftData]) => {
if (fromName !== toName) {
let [give, receive] = giftData;
if (give > receive) {
tempAnswer += 1;
} else if (give === receive) {
if (dstData[fromName][fromName] > dstData[toName][toName]) {
//선물 지수의 비교
tempAnswer += 1;
}
}
}
});
answer = Math.max(answer, tempAnswer);
});
return answer;
<Object.entries 예시>
✅ 객체의 열거 가능한 속성 [key, value] 쌍의 배열을 반환하며 console.log로 찍어보면 2차원 배열 형태로 출력
const exampleObj = {
name: "Alice",
age: 25,
city: "Wonderland"
};
const entries = Object.entries(exampleObj);
[
["name", "Alice"],
["age", 25],
["city", "Wonderland"]
]
<최종 코드>
function solution(friends, gifts) {
let answer = 0;
let dstData = {};
// dstData 초기화 -> dstData는 2중 객체이다.
friends.forEach((outerName) => {
dstData[outerName] = {};
friends.forEach((innerName) => {
if (outerName !== innerName) {
dstData[outerName][innerName] = [0, 0]; // [준 개수, 받은 개수]
} else {
dstData[outerName][innerName] = 0; // 같은 경우 선물 지수 0
}
});
});
// dstData 파싱
gifts.forEach((gift) => {
let [from, to] = gift.split(" ");
dstData[from][from] += 1; // 선물 준 사람의 선물 지수 증가
dstData[to][to] -= 1; // 선물 받은 사람의 선물 지수 감소
dstData[from][to][0] += 1; // from이 to에게 준 선물 개수 증가
dstData[to][from][1] += 1; // to가 from에게 받은 선물 개수 증가
});
// 각 친구별로 최댓값 계산
Object.entries(dstData).forEach(([fromName, giftDatas]) => {
let tempAnswer = 0;
Object.entries(giftDatas).forEach(([toName, giftData]) => {
if (fromName !== toName) {
let [give, receive] = giftData;
if (give > receive) {
tempAnswer += 1;
} else if (give === receive) {
if (dstData[fromName][fromName] > dstData[toName][toName]) {
//선물 지수의 비교
tempAnswer += 1;
}
}
}
});
answer = Math.max(answer, tempAnswer);
});
return answer;
}
<참고 블로그>
https://ko.javascript.info/keys-values-entries
Object.keys, values, entries
ko.javascript.info
'코테 및 알고리즘' 카테고리의 다른 글
2022 KAKAO TECH INTERNSHIP 문제 (0) | 2024.05.23 |
---|---|
프로그래머스 2023 KAKAO BLIND RECRUITMENT (0) | 2024.05.21 |
백준 js 1406번 (0) | 2024.05.13 |
백준 js 2805번 (0) | 2024.04.29 |
백준 js 1965번 (0) | 2024.04.16 |