[Programmers] 선물 주고받기 계산 (Java)

2025. 4. 27. 18:08· Algorithm
목차
  1. 1. 초기 세팅
  2. 2. 선물 기록 파싱
  3. 3. 누가 추가 선물을 받을지 계산
  4. 4. 최종 답 구하기
반응형

- 알고리즘 분류 : 구현
- 사용 언어 : JAVA

(효율성 테스트가 없어 생각나는대로 작성)

1. 초기 세팅

  • giftMap:
    → 친구들끼리 누가 누구에게 몇 번 선물했는지 저장하는 2차원 Map.
    (예: giftMap["A"]["B"] = 2 → A가 B에게 선물 2번 줌)
  • summaryMap:
    → 각 친구의 총 준 선물 수(GIVE), 받은 선물 수(RECEIVE), 그리고
    선물지수(SCORE = GIVE - RECEIVE) 를 저장하는 Map.

요약:
→ 선물 내역과 선물지수를 따로 정리할 준비를 함.


2. 선물 기록 파싱

  • gifts 배열을 순회하면서 "sender receiver" 형태를 split 해서
    → sender가 receiver에게 선물한 횟수를 1 추가함.
  • 그리고 summaryMap에서:
    • sender의 GIVE +1
    • receiver의 RECEIVE +1
    • 둘 다 SCORE(GIVE - RECEIVE) 재계산

요약:
→ 선물을 주고받을 때마다 각각의 보낸 개수, 받은 개수, 선물지수를 최신화.


3. 누가 추가 선물을 받을지 계산

  • 모든 친구를 2명씩 짝지어서 비교 (i, j 루프)
  • 서로 주고받은 선물 수를 비교해서:
    • 더 많이 준 사람이 추가 선물 1개를 얻음.
  • 만약 주고받은 수가 같으면:
    • 선물지수(SCORE)가 더 높은 사람이 추가 선물 1개 얻음.
  • 이 결과를 totalMap에 저장.
    (totalMap["A"] = 3 → A는 최종적으로 3개 추가 선물 받음)

4. 최종 답 구하기

  • totalMap을 순회하면서
    → 가장 많이 선물을 추가로 받은 친구의 개수(maxGiftCount) 를 구해서 리턴.

 

import java.util.*;
class Solution {
    public int solution(String[] friends, String[] gifts) {
        final String GIVE = "GIVE";
        final String RECEIVE = "RECEIVE";
        final String SCORE = "SCORE";
        
        Map<String, Map<String, Integer>> giftMap = new HashMap<>();
        Map<String, Map<String, Integer>> summaryMap = new HashMap<>();
        
        // 표 작성
        for (String cur : friends) {
            // 1. 선물 표
            Map<String, Integer> curMap = new HashMap<>();
            for (String name : friends) {
                curMap.put(name, 0);
            }
            giftMap.put(cur, curMap);
            
            // 2. 선물지수 표
            Map<String, Integer> curSummaryMap = new HashMap<>();
            curSummaryMap.put(GIVE, 0);
            curSummaryMap.put(RECEIVE, 0);
            curSummaryMap.put(SCORE, 0);
            summaryMap.put(cur, curSummaryMap);
        }
        
        for (String gift : gifts) {
            String[] giftArr = gift.split(" ");
            String sender = giftArr[0];
            String receiver = giftArr[1];
            
            // 발신쪽
            Integer giftCount = giftMap.get(sender).get(receiver);
            giftMap.get(sender).put(receiver, giftCount+1);
            
            Integer giveCount = summaryMap.get(sender).get(GIVE);
            Integer receiveCount = summaryMap.get(sender).get(RECEIVE);
            giveCount++;
            summaryMap.get(sender).put(GIVE, giveCount);
            summaryMap.get(sender).put(SCORE, (giveCount - receiveCount));
            
            receiveCount = summaryMap.get(receiver).get(RECEIVE);
            giveCount = summaryMap.get(receiver).get(GIVE);
            receiveCount++;
            summaryMap.get(receiver).put(RECEIVE, receiveCount);
            summaryMap.get(receiver).put(SCORE, (giveCount - receiveCount));
        }
        
        // 계산시작
        Map<String, Integer> totalMap = new HashMap<>();
        
        for (int i=0; i<friends.length; i++) {
            String cur = friends[i];
            for (int j=i+1; j<friends.length; j++) {
                String name = friends[j];
                Integer curGiveCount = giftMap.get(cur).get(name);
                Integer nameGiveCount = giftMap.get(name).get(cur);
                
                if (curGiveCount > nameGiveCount) {
                    if (totalMap.get(cur) == null) {
                        totalMap.put(cur, 1);
                    } else {
                        totalMap.put(cur, totalMap.get(cur) + 1);
                    }
                } else if (curGiveCount < nameGiveCount) {
                    if (totalMap.get(name) == null) {
                        totalMap.put(name, 1);
                    } else {
                        totalMap.put(name, totalMap.get(name) + 1);
                    }
                } else { // 선물지수로 비교
                    Integer curScore = summaryMap.get(cur).get(SCORE);
                    Integer nameScore = summaryMap.get(name).get(SCORE);
                    
                    if (curScore > nameScore) {
                        if (totalMap.get(cur) == null) {
                            totalMap.put(cur, 1);
                        } else {
                            totalMap.put(cur, totalMap.get(cur)+1);
                        }
                    } else if (curScore < nameScore) {
                        if (totalMap.get(name) == null) {
                            totalMap.put(name, 1);
                        } else {
                            totalMap.put(name, totalMap.get(name)+1);
                        }
                    }
                }
            }
        }
        
        int maxGiftCount = 0;
        for (String name : friends) {
            if (totalMap.get(name) != null) {
                maxGiftCount = Math.max(maxGiftCount, totalMap.get(name));
            }
            
        }
        
        return maxGiftCount;
    }
}



 

소스 설명은 주석을 참고해주세요.

반응형

'Algorithm' 카테고리의 다른 글

[BAEKJOON] 14940번 : 쉬운 최단거리 (JAVA)  (1) 2025.05.05
[BAEKJOON] 1063번 : 킹(JAVA)  (0) 2025.05.02
[BAEKJOON] 7569번 : 토마토 (JAVA)  (1) 2024.02.18
[BAEKJOON] 2580번 : 스도쿠 (JAVA)  (0) 2024.01.14
[BAEKJOON] 14284번 : 간선 이어가기 2 (JAVA)  (0) 2024.01.07
  1. 1. 초기 세팅
  2. 2. 선물 기록 파싱
  3. 3. 누가 추가 선물을 받을지 계산
  4. 4. 최종 답 구하기
'Algorithm' 카테고리의 다른 글
  • [BAEKJOON] 14940번 : 쉬운 최단거리 (JAVA)
  • [BAEKJOON] 1063번 : 킹(JAVA)
  • [BAEKJOON] 7569번 : 토마토 (JAVA)
  • [BAEKJOON] 2580번 : 스도쿠 (JAVA)
멍목
멍목
개발 관련 새롭게 알게 된 지식이나 좋은 정보들을 메모하는 공간입니다.
반응형
멍목
김멍목의 개발블로그
멍목
전체
오늘
어제
  • 분류 전체보기 (514)
    • BE (190)
      • Spring (21)
      • Java (141)
      • Kotlin (6)
      • JPA (22)
    • FE (33)
      • Javascript (16)
      • Typescript (0)
      • React (5)
      • Vue.js (9)
      • JSP & JSTL (3)
    • DB (32)
      • Oracle (22)
      • MongoDB (10)
    • Algorithm (195)
    • Linux (8)
    • Git (6)
    • etc (42)
    • ---------------------------.. (0)
    • 회계 (4)
      • 전산회계 2급 (4)
    • 잡동사니 (2)

블로그 메뉴

  • 홈
  • 관리

공지사항

인기 글

태그

  • 자기공부
  • 자바 테스팅 프레임워크
  • java 8
  • 더 자바 Java 8
  • 자바 개발자를 위한 코틀린 입문
  • 알고리즘 공부
  • 자바공부
  • Oracle
  • 자기 공부
  • junit5
  • Effective Java
  • 이펙티브자바
  • 코틀린
  • JPA 공부
  • 자기 개발
  • 이펙티브 자바
  • 더 자바 애플리케이션을 테스트하는 다양한 방법
  • MongoDB with Node.js
  • vue3 공부
  • 알고리즘공부
  • MongoDB 공부
  • MongoDB 기초부터 실무까지
  • JPA
  • 자바 공부
  • 자기개발
  • 전산회계 2급 준비
  • 코테공부
  • 프로젝트로 배우는 Vue.js 3
  • 코테 공부
  • Java to Kotlin

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.0
멍목
[Programmers] 선물 주고받기 계산 (Java)
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.