알고리즘

[프로그래머스, 자바, 258712번] 가장 많이 받은 선물

hminor 2024. 10. 1. 18:11
반응형

풀이

  • 해당 문제 풀이는 크게 복잡한 건 없었지만
  • 순조롭게 해결하기 위해 어떻게 할 지 고민을 했고,
  • 그에 따른 결과는 친구들의 접근을 위해 map으로 넘버링하기
  • 그리고 2차원 배열로 각 인물 별로 
  • 받은 선물의 개수를 체크하고, 준 선물을 체크하기
  • 그리고 동시에 선물 지수를 체크하기 위해 별도로 코드 넣기
  • 마지막으로 2중 for 문으로 준 선물이 큰지 혹은,
  • 준 선물이 같다면 선물 지수가 클 경우면 result에 추가하기.
  • 이후 배열에서 가장 큰 값을 출력하여 해결.

 

import java.util.*;
class Solution {
    public int solution(String[] friends, String[] gifts) {
        StringTokenizer st;
        int ln = friends.length;
        
        // map으로 멤버 넘버링
        Map<String,Integer> dic = new HashMap<>();
        int idx = 0;
        for (String f: friends) {
            dic.put(f,idx);
            idx++;
        }
        
        // i,j 같은 크기의 2차원 배열
        int[][] mtx = new int[ln][ln];
        // 선물 지수
        int[] ji_li = new int[ln];
        // 결과
        int[] result = new int[ln];
        
        // 선물 교환
        for (String gift: gifts) {
            st = new StringTokenizer(gift);
            String a = st.nextToken();
            String b = st.nextToken();
            mtx[dic.get(b)][dic.get(a)]+=1;
            ji_li[dic.get(a)]+=1;
            ji_li[dic.get(b)]-=1;
        }
        
        for (int i=0; i<ln; i++) {
            for (int j=0; j<ln; j++) {
                if (i!=j) {
                    if (mtx[j][i] > mtx[i][j] || (mtx[j][i] == mtx[i][j] && ji_li[i]>ji_li[j])) result[i]++;
                }
            }
        }
        
        return Arrays.stream(result).max().orElse(0);
    }
}