끄적이는 개발노트
[프로그래머스 / Javascript] 2024 KAKAO WINTER INTERNSHIP > 가장 많이 받은 선물 본문
문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/258712
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
문제 설명
제한사항
입출력 예
내 문제 풀이
function solution(friends, gifts) {
const giftCountList = {}; // 선물 지수 Object
const giftList = {}; // 선물 리스트 Object
const result = {}; // 다음 달 받을 선물 Object
// friends 배열을 활용하여 초기값 세팅
for (const friend of friends) {
// 초기값 : 0
giftCountList[friend] = 0;
// 초기값 : 준 사람 : {받은 사람 : 0, 받은 사람 : 0, ...}
giftList[friend] = {};
for(const friend2 of friends) {
giftList[friend][friend2] = 0
}
// 초기값 : 0
result[friend] = 0;
}
// gifts 변수를 통해서 값 할당
for (const gift of gifts) {
// split을 통해 준 사람, 받은 사람 구하기
const send = gift.split(" ")[0]
const recieve = gift.split(" ")[1]
// 선물 리스트 : 준 사람 입장에서만 +1
giftList[send][recieve] += 1;
// 선물 지수 : 보냈을 경우 +1 / 받았을 경우 -1
giftCountList[send] += 1;
giftCountList[recieve] -= 1;
}
// 선물 지수와 선물 리스트를 가지고 다음 달 받을 선물 계산
// 준 사람과 받은 사람의 이름이 필요하므로 이중 반복문
for (const friend of friends) {
for (const friend2 of friends) {
// 선물 리스트에서 보낸 값과 받은 값 가져오기
const sendNum = giftList[friend][friend2];
const recieveNum = giftList[friend2][friend]
// 해당 사람이 보낸 값이 더 클 경우(다음 달에 선물을 받는 경우)만 계산
// 보낸 값이 더 클 경우
if(sendNum > recieveNum) result[friend] += 1;
// 보낸 값과 받은 값이 같지만 선물 지수가 더 큰 경우
else if(sendNum === recieveNum) {
if(giftCountList[friend] > giftCountList[friend2]) {
result[friend] += 1;
}
}
}
}
// 다음 달 선물 Object에서 값 배열로 전환 후, 최대 값 구하기
const answer = Math.max(...Object.values(result))
return answer;
}
마주친 문제점 및 해결
첫 코딩 테스트 문제였는데 푸는데 2시간 정도가 걸릴 정도로 알고리즘에 익숙하지 않다보니 문제 해결 자체에 어려움을 겪었다. 확실히 내가 부족한 부분들이 보이는 시간이었다. 앞으로도 꾸준히 프로젝트 시간 외에 틈날 때마다 코딩테스트 문제를 풀어보면 발생한 에러, 부족한 점들을 배워나가면 개념적으로나 실력적으로나 향상될 것 같다.
1. 근본적으로 코드가 지저분하고 길었다.
solution) 알고는 있었지만 익숙하지 않다는 이유로 사용하지 않았던(사실상 모르는 것과 다름없었던) Javascript 메소드를 찾아 적용해보면서 코드를 수정했다.
2. 처음에는 접근방식을 friends와 gifts 변수를 동시에 사용해서 계산하려다보니 문제 해결에 있어 어려움을 겪었다.
solution) 해결하기 위해 friends를 초기값 세팅용, gifts를 값 계산용으로 나눠서 작업하니 코드 작성이 그 때부터 속도가 붙고 더 편리해졌다.
3. 다음 달 받을 선물을 계산하는 과정에서 두 사람 사이의 보낸 선물 수와 받은 선물 수의 차이에 따라 result의 key 값을 변경하고 더하는 방식으로 두 사람의 값을 한번에 처리하려고 시도했다. 그러다보니 이중 반복문이기 때문에 보내고 받은 차이만 있을 뿐 똑같은 사람끼리의 계산이 두번씩 반복되어 결과값이 두배로 나왔다.
solution) 해결하기 위해 result 처리 로직에서 다음 달 선물을 받는 경우만 처리했다. 이렇게 하니 result의 key 값에 해당하는 사람이 받는 경우만 계산이 되기 때문에 경우의 수가 중복되서 처리되는 경우가 사라졌다.
다른 사람의 문제풀이
function solution(friends, gifts) {
const length = friends.length
const giftPoints = new Array(length).fill(0)
const index = {}
const record = []
const points = new Array(length).fill(0)
for(let i=0;i<length;i++){
record[i]=new Array(length).fill(0)
index[friends[i]] = i
}
for(const gift of gifts){
const [giver, taker] = gift.split(' ')
record[index[giver]][index[taker]] +=1
giftPoints[index[giver]] +=1
giftPoints[index[taker]] -=1
}
for(let i=0;i<length;i++){
for(let j=0;j<length;j++){
if(record[i][j]>record[j][i]){
points[i]+=1
} else if(record[i][j]===record[j][i]){
if(giftPoints[i]>giftPoints[j]){
points[i]+=1
}
}
}
}
return Math.max(...points)
}
차이점 및 배운점
- Object 타입으로 풀었던 값들을 array형태로 처리해 index로 편하게 값 매핑
- split 함수를 통해 나온 결과값을 구조 분해 할당을 통해 간단하게 변수 지정
'코딩테스트' 카테고리의 다른 글
[프로그래머스 / Javascript] 2025 프로그래머스 코드챌린지 2차 예선 > 택배 상자 꺼내기 (0) | 2025.05.05 |
---|