준영이의 성장일기(FrontEnd)

프로그래머스 2024 KAKAO WINTER INTERNSHIP 1번 본문

코테 및 알고리즘

프로그래머스 2024 KAKAO WINTER INTERNSHIP 1번

Jay_Jung 2024. 5. 19. 11:11

 

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