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

sundays·2024년 3월 19일
0

문제

가장 많이 받은 선물

풀이

hashmap 를 사용하는건 알겠는데, 맵을 어떻게 이용하면 중복으로 선물을 하는것에 대해 깔끔한 방법이 떠오르지 않아서 손을 못댔던것 같다.

중복으로 선물을 하는부분은 Hashmap안에 hashmap을 넣고 K:선물받는 사람, V:횟수를 저장한 후에 0부터 friend.length 까지 이 횟수를 가지고 비교를 한다.

// 개인 선물 전달 Map 선언
HashMap<String, HashMap<String, Integer>> hm = new HashMap<>();
for (String s: friends) {
	// value는 s가 전달할 선물받을 사람(K) 개수 (V) 가 됩니다. 
	hm.put(s, new HashMap<>());
}

그다음 선물을 전달받을 Map안에 데이터를 넣습니다.

// 선물 전달 Map 주는 사람(K) 횟수(V)
HashMap<String, Integer> giveHm = new HashMap<>();
// 선물 받는 Map 받는사람(K) 횟수(V)
HashMap<String, Integer> takeHm = new HashMap<>();

for (int i =0; i < gifts.length; i++) {
	String[] g = gifts[i].split(" ");
    String give = g[0];
    String take = g[1];
    
    // 개인 선물 전달 MAP 
    hm.get(give).put(take, hm.get(take).getOrDefault(take, 0) + 1);
    // 주는 사람 추가
    giveHm.put(give, giveHm.getOrDefault(give, 0) + 1);
    // 받는 사람 추가
    takeHm.put(take, takeHm.getOrDefault(take, 0) + 1);
}

문제에서 나와있는대로 두 사람이 주고받은 이력이 존재 한다면 서로가 몇개씩 주고 받았는지 확인 후 높은 사람에게 한개를 전달해주되, 서로의 주고받은 이력이 같다면 선물 지수를 비교하여 높은 사람에게 한개를 주게 됩니다.

문제만 잘 읽어도 떡이 나온다.(이게 제가 제일 못하는거 입니다)

// 받을 선물 개수 MAP
HashMap<String, Integer> gift = new HashMap<>();

for (int i = 0; i < friend.length; i++) {
	for (int j = 0; j < i; j++) {
    	String a = friend[i];
        String b = friend[j];
        
        // 서로 주고 받은 횟수 비교
        int aNumber = hm.get(a).getOrDefault(b, 0);
        int bNumber = hm.get(b).getOrDefault(a, 0);
        
        if (aNumber > bNumber) {
			gift.put(a, gift.getOrDefault(a, 0) + 1);
        } else if (aNumber < bNumber) {
        	gift.put(b, gift.getOrDefault(b, 0) + 1);
        } else {
        	// 서로의 선물 지수 비교
           	int aGift = giveHm.getOrDefault(a, 0) - takeHm.getOrDefault(b, 0);
            int bGift = giveHm.getOrDefault(b, 0) - takeHm.getOrDefault(b, 0); 
            
            if (aGift > bGift) {
            	gift.put(a, gift.getOrDefault(a, 0) + 1);
            } else if (aGift < bGift) {
            	gift.put(b, gift.getOrDefault(b, 0) + 1);
            }
        }
    }
}

내 안좋은 습관..
깔끔하게 자료구조만을 이용하는 내용이 아니면 내가 다음 문제로 넘어가려고 한다. 그리고 서로의 선물 지수를 비교하는 부분을 제대로 못보고 그냥 넘어간다는거다. 그래서 결국 틀려서 멘붕에 빠지고 다음 문제까지도 어버버 하는상태라는 것. 그리고 네이밍 맞춰야 하는게 정말 나한테 강박같은거라서 몇번을 바꿔야 했는지 모르겠다. 맘에 들때까지 바꿔댐. ;;

30분안에 문제 풀기가 어려웠다.
구현 문제는 역시 어렵다.

전체 코드

전체 코드

profile
develop life

0개의 댓글