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차원 배열을 통해서 간단하게 정리한 코드를 보고 배운 것이 많았던 문제였음