본문 바로가기

verdantjuly/코딩테스트

프로그래머스 코딩테스트 연습 : 가장 많이 받은 선물 (javascript, 20240125)

728x90

문제 바로가기: https://school.programmers.co.kr/learn/courses/30/lessons/258712

나의 풀이 FAIL

function solution(friends, gifts) {
    
    // A가 선물을 주고 
    // B가 선물을 줬다면
    // 선물을 더 많이 준 사람이 다음 달 선물 +1
    // 선물을 더 적게 준 사람이 다음 달 선물 -1
    
    // 선물을 주고 받은 기록 0
    // A = B   
    // 선물 지수가 더 작은 사람 선물 -1
    // 선물 지수가 더 큰 사람 선물 +1
    
    // 친구들의 이름 배열 friends
    
    // 선물의 기록 gifts
    // " "로 split 
    
    // 기록을 할 준비 
    let record = new Map();
    let nextMonth = new Map();
    let data = {}
    let total = []
   
    for (i=0; i<friends.length; i++){
        let friendI = friends[i]
        data[friendI] = 0
      
    }
    
 
    for (i=0; i<friends.length; i++){
          record.set(friends[i], data)
          nextMonth.set(friends[i], 0)
    }
   
    // 이번달 
    for (i=0; i<gifts.length; i++){
        let giver = gifts[i].split(" ")[0]
        let receiver = gifts[i].split(" ")[1]
        let giverOriginalData = record.get(giver)
        let receiverOriginalData = record.get(receiver)
         
        // 선물 지수는 본인의 이름 key의 value
        giverOriginalData[giver] = giverOriginalData[giver] +1
        receiverOriginalData[receiver] = receiverOriginalData[receiver] -1
        
        // 선물 교환 기록
        giverOriginalData[receiver] =  giverOriginalData[receiver] -1
        receiverOriginalData[giver] = receiverOriginalData[giver] +1
        
        record.set(giver, giverOriginalData)
        record.set(receiver, receiverOriginalData)
        
    }
    
    // 다음달 
for(i=0; i<friends.length; i++){
           for(j = friends.length -1 ; j>i; j--){ 
             
            let friendI = friends[i]
            let friendJ = friends[j]

            let IOriginalData = record.get(friendI)
            let JOriginalData = record.get(friendJ)
            
            if ( IOriginalData[friendJ] < JOriginalData[friendI]){
               
                nextMonth.set (friendI, nextMonth.get(friendI) + 1)
            
                
            } else if (  IOriginalData[friendJ] > JOriginalData[friendI]){
           
            
                nextMonth.set (friendJ, nextMonth.get(friendJ) + 1)
               
            }  else if (  IOriginalData[friendJ] == JOriginalData[friendI]) {
             
               if (IOriginalData[friendI] > JOriginalData[friendJ]){
                   nextMonth.set (friendI, nextMonth.get(friendI) + 1)
                 
               } else if (IOriginalData[friendI] < JOriginalData[friendJ]){
                 
                nextMonth.set (friendJ, nextMonth.get(friendJ) + 1)
               }  
            }
    }
}
   
    
    for(i=0; i<friends.length; i++){
        let friendI = friends[i]
       
        total.push(nextMonth.get(friendI))
    }
    return total
return Math.max(...total)
        
    
}

 

다른 사람의 풀이

조금 더 노력하기 위해 보지 않았음

소감

새벽 4시까지 풀었지만 풀지 못했다.

다양한 자료구조와 사용법을 익혀야겠다고 생각이 들었다.

내가 알고 있는 걸로 어떻게든 해 보려고 했는데 잘 안 됐다. 

코드도 많이 길어졌다.