가장 많이 받은 선물

하이솝·2026년 3월 7일

2026.03.07

1차 실행 오류
같은 이름을 탐색하려고 넣어 두었던
for (int j = 0; j < v.size(); j++) 부분이 인덱스를 직접 찾는 메소드로 대체하면서 필요가 없어졌는데 제거하지 않았음.
또한 getReceive를 할 때 현재 클래스의 score의 상태가 초기화가 되지 않아 값이 올바른 값을 비교를 할 수 없었음

import java.util.Vector;
class Friend {
    private String name;
    private int index;
    private int gives[];
    private int score = 0;
    private int receive = 0;
    public Friend(String name, int index, int size) {
        this.name = name;
        this.index = index;
        gives = new int[size];
        for (int i = 0; i < size; i++) {
            gives[i] = 0;
        }
    }
    public String getName() {
        return name;
    }
    public int getIndex() {
        return index;
    }
    public void plusGives(int index) {
        gives[index]++;
    }
    public void minusGives(int index) {
        gives[index]--;
    }
    public int getScore() {
        score = 0;
        for (int i = 0; i < gives.length; i++) {
            score += gives[i];
        }
        return score;
    }
    public int getReceive(Vector<Friend> v) {
        for (int i = 0; i < gives.length; i++) {
            if (i == index) {
                continue;
            }
            if (gives[i] > 0) {
                receive++;
            }
            else if (gives[i] == 0) {
                if(compare(v, i)) {
                    receive++;
                }
            }
        }
        return receive;
    }
    public boolean compare(Vector<Friend> v, int index) {
        if (score > v.get(index).getScore()) {
            return true;
        }
        return false;
    }
}
class Solution {
    public int solution(String[] friends, String[] gifts) {
        int answer = 0;
        Vector<Friend> v = new Vector<Friend>();
        // 벡터에 클래스 저장
        for (int i = 0; i < friends.length; i++) {
            v.add(new Friend(friends[i], i, friends.length));
        }
        for (int i = 0; i < gifts.length; i++) {
            String list[] = gifts[i].split(" ");
            for (int j = 0; j < v.size(); j++) {
                int give = findIndex(v, list[0]);
                int receive = findIndex(v, list[1]);
                v.get(give).plusGives(receive);
                v.get(receive).minusGives(give);
            }
        }
        for (int i = 0; i < v.size(); i++) {
            if (v.get(i).getReceive(v) > answer) {
                answer = v.get(i).getReceive(v);
            }   
        }
        return answer;
    }
    public int findIndex(Vector<Friend> f, String name) {
        for (int i = 0; i < f.size(); i++) {
            if (name.equals(f.get(i).getName())) {
                return i;
            }
        }
        return -1;
    }
}

소요 시간: 1시간 30분

나의 정답

import java.util.Vector;
class Friend {
    private String name;
    private int index;
    private int gives[];
    private int score = 0;
    private int receive = 0;
    public Friend(String name, int index, int size) {
        this.name = name;
        this.index = index;
        gives = new int[size];
        for (int i = 0; i < size; i++) {
            gives[i] = 0;
        }
    }
    public String getName() {
        return name;
    }
    public int getIndex() {
        return index;
    }
    public void plusGives(int index) {
        gives[index]++;
    }
    public void minusGives(int index) {
        gives[index]--;
    }
    public int getScore() {
        score = 0;
        for (int i = 0; i < gives.length; i++) {
            score += gives[i];
        }
        return score;
    }
    public int getReceive(Vector<Friend> v) {
        for (int i = 0; i < gives.length; i++) {
            if (i == index) {
                continue;
            }
            if (gives[i] > 0) {
                receive++;
            }
            else if (gives[i] == 0) {
                if(compare(v, i)) {
                    receive++;
                }
            }
        }
        return receive;
    }
    public boolean compare(Vector<Friend> v, int index) {
        score = getScore();
        if (score > v.get(index).getScore()) {
            return true;
        }
        return false;
    }
}
class Solution {
    public int solution(String[] friends, String[] gifts) {
        int answer = 0;
        Vector<Friend> v = new Vector<Friend>();
        // 벡터에 클래스 저장
        for (int i = 0; i < friends.length; i++) {
            v.add(new Friend(friends[i], i, friends.length));
        }
        for (int i = 0; i < gifts.length; i++) {
            String list[] = gifts[i].split(" ");
            int give = findIndex(v, list[0]);
            int receive = findIndex(v, list[1]);
            v.get(give).plusGives(receive);
            v.get(receive).minusGives(give);
        }
        for (int i = 0; i < v.size(); i++) {
            int receive = v.get(i).getReceive(v);
            if (receive > answer) {
                answer = receive;
            }   
        }
        return answer;
    }
    public int findIndex(Vector<Friend> f, String name) {
        for (int i = 0; i < f.size(); i++) {
            if (name.equals(f.get(i).getName())) {
                return i;
            }
        }
        return -1;
    }
}

AI 정답
HashMap을 사용하여 이름과 인덱스번호 매핑
2차원 배열을 통해 주고받은 선물의 개수 저장

import java.util.*;
class Solution {
    public int solution(String[] friends, String[] gifts) {
        int n = friends.length;
        // 1. 이름 -> 인덱스 매핑 (속도 최적화의 핵심)
        Map<String, Integer> nameIdx = new HashMap<>();
        for (int i = 0; i < n; i++) {
            nameIdx.put(friends[i], i);
        }
        // 2. 데이터 저장 공간 (객체 대신 배열로 가볍게)
        int[][] history = new int[n][n]; // 누가 누구에게 줬는지 (마이너스 방식 대신 명확하게 기록)
        int[] giftScore = new int[n];    // 선물 지수
        // 3. 선물 기록 처리
        for (String gift : gifts) {
            String[] split = gift.split(" ");
            int giver = nameIdx.get(split[0]);
            int receiver = nameIdx.get(split[1]);
            history[giver][receiver]++; // 준 기록 +1
            giftScore[giver]++;         // 준 사람 지수 +1
            giftScore[receiver]--;      // 받은 사람 지수 -1
        }
        // 4. 다음 달 받을 선물 계산
        int maxNextMonthGifts = 0;
        for (int i = 0; i < n; i++) {
            int currentFriendReceive = 0;
            for (int j = 0; j < n; j++) {
                if (i == j) continue;
                // 조건 1: 내가 준 게 더 많으면 무조건 받음
                if (history[i][j] > history[j][i]) {
                    currentFriendReceive++;
                } 
                // 조건 2: 주고받은 기록이 없거나 같으면 '선물 지수' 비교
                else if (history[i][j] == history[j][i]) {
                    if (giftScore[i] > giftScore[j]) {
                        currentFriendReceive++;
                    }
                }
            }
            maxNextMonthGifts = Math.max(maxNextMonthGifts, currentFriendReceive);
        }
        return maxNextMonthGifts;
    }
}

클래스 객체 만들어서 1차원 배열로 저장하고 인덱스 번호 반환하면서 탐색했던 것들을 HashMap이랑 2차원 배열을 통해서 간단하게 정리한 코드를 보고 배운 것이 많았던 문제였음

0개의 댓글