[프로그래머스] [java] 가장 많이 받은 선물

파워소동·2024년 5월 10일
0

프로그래머스

목록 보기
3/3

문제 설명은 아래와 같다.

일단 그냥 생각나는대로 그냥 짬

  • 모든 인원을 2중 for문을 돌면서 돌 때 마다 a와 b를 비교하는 방법

내가 짰지만~~ 너무 쓰레기 같아서 올리기도 부끄러움ㅋㅋ...
그래서 코드는 안 올렸어요

돌아간다고해서 잘 짠 코드가 아니죠? 속도 효율 개똥;;

특단의 결심.

다시 짠다 이거야

코드와 헤어질 결심.

import java.util.*;

class Solution {
    public int solution(String[] friends, String[] gifts) {
        // 선물을 주고받은 이차원 배열, 누가 누구에게 몇개 줬는지 담음
        int allGifts[][] = new int [friends.length][friends.length];
        // 0으로 세팅
        for (int i = 0; i < allGifts.length; i++) {
            Arrays.fill(allGifts[i], 0);
        }
        
        // 선물 지수 배열
        int giftLevel[] = new int[friends.length];
        // 0으로 세팅
        Arrays.fill(giftLevel, 0);
        
        // 이름으로 인덱스를 찾기 위한 map
        HashMap<String, Integer> friendsIndexMap = new HashMap<String, Integer>();
        
        // map에다가 key는 이름 value는 index 세팅
        for(int i = 0 ; i <friends.length ; i++) {
            friendsIndexMap.put(friends[i], i);
        }
        
        // gifts를 for문 돌리면서 allGifts 2차원 배열 채우기 
        for(String gift : gifts) {
            String [] nowFriends = gift.split(" ");
            int giveFrinedIndex = friendsIndexMap.get(nowFriends[0]);
            int givenFrinedIndex = friendsIndexMap.get(nowFriends[1]);
            allGifts[giveFrinedIndex][givenFrinedIndex]++;
            
            // 선물지수 계산
            giftLevel[giveFrinedIndex]++;
            giftLevel[givenFrinedIndex]--;
        }
        
        // 다음달에 가장 많은 선물을 받는 친구가 받을 선물의 수 
        int max = 0;
        for(int i = 0 ; i <friends.length ; i++) {
            int perMax = 0;
            for(int j = 0 ; j <friends.length ; j++) {
                // i, j가 같으면 같은 사람이므로 continue
                if(i==j) continue;

                int countDiff = allGifts[i][j]-allGifts[j][i];
                // i가 선물을 더 많이 받았으면 +1
                if(countDiff > 0) {
                    perMax++;
                } else if(countDiff == 0) {
                // i와 j의 주고받은 선물 수가 0인 경우 선물 지수에 따라 +1
                    if(giftLevel[i]-giftLevel[j] > 0) {
                        perMax++;
                    }
                }
            }
            max = perMax > max ? perMax : max;
        }
        
        return max;
    }
}

하하

0개의 댓글