새소식

반응형
250x250
Programmers/Lv.1

프로그래머스 - 가장 많이 받은 선물

  • -
728x90
반응형

반응형

 

솔직히 처음 이 문제 보고 나서 도대체 카카오는 문제를 왜 이렇게 보기 힘들게 내지..? 라는 생각이 들었다.

 

문제가 뭔가 되게 복잡해보이고 길다..ㅎ

 

대충 선물을 받는데 가장 많이 받는 사람이 받는 개수를 구하라는 것.

 

고민에 고민을 하고 HashMap을 써보자! 했지만

 

어떤 방식으로 풀어야 하는지도 잘 모르겠었다.

 

그래서 다른 사람의 풀이도 봤지만... 다들 문제 보기가 힘들었지 막상 문제대로 코드를 작성하면

 

쉽게 풀린다고..말하네...?

 

그래서 내 나름 정리를 해보려고 올린다.

 

먼저 카카오 친구들의 이름과 인덱스를 저장할 HashMap을 만든 후 이름과 인덱스를 저장한다.

 

HashMap<String, Integer> names = new HashMap<>();

for(int i = 0; i < fLength; i++) {
	names.put(friends[i], i);
}

 

그 다음 선물을 주고 받은 개수와 선물 지수를 기록해둘 배열을 만든다.

 

int[] record = new int[fLength];
int[][] graph = new int[fLength][fLength];

 

그 후 gifts 배열을 반복하며 선물지수와 주고받은 개수를 기록해준다.

 

for(String gift : gifts) {
	String[] eachName = gift.split(" ");
    // 선물을 준 사람 선물지수 1 상승
    record[names.get(eachName[0])]++;
    // 선물을 받은 사람 선물지수 1 감소
    record[name.get(eachName[1])]--;
    // 주고받은 선물 기록
    graph[name.get(eachName[0])][name.get(eachName[1])]++:
}

 

그 후 반복문을 돌며 선물을 제일 많이 받을 사람의 개수를 찾는다.

 

for(int i = 0; i < fLength; i++) {
	int num = 0;
    for(int j = 0; j < fLength; j++) {
    	if(i == j) {
        	continue;
        }
        
        // 받은 선물보다 준 선물이 많을 때나 만약 주고 받은 선물이 같다면 선물지수가 높은 사람에게
        //선물을 줘야함.
        if(graph[i][j] > graph[j][i] || (graph[i][j] == graph[j][i] && record[i] > record[j]) {
        	num++;
        }
    }
    answer = num;
}

 

전체 코드이다.

 

import java.util.*;

class Solution {
    public int solution(String[] friends, String[] gifts) {
        int answer = 0;
        int fLength = friends.length;
        HashMap<String, Integer> names = new HashMap<>();
        int[] record = new int[fLength];
        int[][] graph = new int[fLength][fLength];
        
        for(int i = 0; i < fLength; i++) {
            names.put(friends[i], i);
        }
        
        for(String gift : gifts) {
            String[] giftName = gift.split(" ");
            record[names.get(giftName[0])]++;
            record[names.get(giftName[1])]--;
            graph[names.get(giftName[0])][names.get(giftName[1])]++;
        }
        
        for(int i = 0; i < fLength; i++) {
            int num = 0;
            for(int j = 0; j < fLength; j++) {
                if(i == j) {
                    continue;
                }
                
                if(graph[i][j] > graph[j][i] ||
                  (graph[i][j] == gigraphftGraph[j][i] && record[i] > record[j])) {
                    num++;
                }
            }
            if(answer < num) {
                answer = num;
            }
        }
        return answer;
    }
}
728x90
반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.