알고리즘 문제 풀기

프로그래머스: 가장 많이 받은 선물 - javascript(구현)

Fo_rdang 2024. 3. 7. 17:46
반응형

문제 출처 

https://school.programmers.co.kr/learn/courses/30/lessons/258712

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제 풀이 힌트 

문제 풀이 코드 

function solution(friends, gifts) {
   let N = friends.length; 
   const nameMap = new Map(); //친구들 이름에 따른 idx map 에 저장 
   const giftTable = Array.from({length: N}).map(() => new Array(N).fill(0)); //친구들끼리 주고받은 선물 내역 저장 
   const rankInfo = new Array(N).fill(0); //선물지수 계산하는 1차원 배열 
   const nextMonth = new Array(N).fill(0); 
    
   //친구들의 이름과 idx를 map에 set 한다.  
   friends.forEach((name, idx) => {
       nameMap.set(name, idx)
   }) 
    
   //선물 내역 저장 
   gifts.forEach((info) => {
       const [from, to] = info.split(' '); 
       giftTable[nameMap.get(from)][nameMap.get(to)]++; 
   })
   
   // 선물 지수 계산 
    for(let i=0; i<N; i++){
        rankInfo[i] = giftTable[i].reduce((a,b) => a+b , 0) //i줄은 선물을 줬으니 +1
        for(let j=0; j<N; j++){ //j줄은 선물을 받은 것이니, 기존 선물지수에서 -1 을 한다. 
            rankInfo[i] -= giftTable[j][i]
        }
    }
    //다음달 받을 선물 수 계산 
     for (let i=0; i<N; i++) {
        for (let j=i+1; j<N; j++) {
            if (i===j) continue;
            if (giftTable[i][j] > giftTable[j][i]) nextMonth[i]++;
            if (giftTable[i][j] < giftTable[j][i]) nextMonth[j]++;
            if (giftTable[i][j] === giftTable[j][i]) {
                if (rankInfo[i] > rankInfo[j]) nextMonth[i]++
                if (rankInfo[i] < rankInfo[j]) nextMonth[j]++
            }
        }
    }
    
    return Math.max(...nextMonth)
}

Only 문제 풀이 

function solution(friends, gifts) {
   let N = friends.length; 
   const nameMap = new Map(); 
   const giftTable = Array.from({length: N}).map(() => new Array(N).fill(0)); 
   const rankInfo = new Array(N).fill(0); 
   const nextMonth = new Array(N).fill(0); 
    
   friends.forEach((name, idx) => {
       nameMap.set(name, idx)
   }) 
    
   gifts.forEach((info) => {
       const [from, to] = info.split(' '); 
       giftTable[nameMap.get(from)][nameMap.get(to)]++; 
   })
    
    for(let i=0; i<N; i++){
        rankInfo[i] = giftTable[i].reduce((a,b) => a+b , 0)
        for(let j=0; j<N; j++){
            rankInfo[i] -= giftTable[j][i]
        }
    }
     for (let i=0; i<N; i++) {
        for (let j=i+1; j<N; j++) {
            if (i===j) continue;
            if (giftTable[i][j] > giftTable[j][i]) nextMonth[i]++;
            if (giftTable[i][j] < giftTable[j][i]) nextMonth[j]++;
            if (giftTable[i][j] === giftTable[j][i]) {
                if (rankInfo[i] > rankInfo[j]) nextMonth[i]++
                if (rankInfo[i] < rankInfo[j]) nextMonth[j]++
            }
        }
    }
    
    return Math.max(...nextMonth)
}

 

알고가는 ppoint

 

반응형