알고리즘/알문풀(백준, 프로그래머스, 코드트리)

[알고리즘] 2024 KAKAO WINTER INTERNSHIP 가장 많이 받은 선물 (Java)

ragabys 2024. 2. 15. 00:49

https://school.programmers.co.kr/learn/courses/30/lessons/258712

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

작년 연말?올해 초?쯤 실행되었던 카카오 윈터 인턴쉽 코딩테스트 문제 중 하나로 제일 쉬운 난이도의 문제다.

 

우선 들어온 friends의 각각의 이름 값들을 HashMap을 활용하여 이차원 배열 인덱스에 매칭시키고,

 

gifts에 들어온 값을 통해 trading의 값과 tradePoint 값을 증감연산하는데,

 

trading은 from 사용자가 to 사용자에게 선물을 준 경우 trading[from][to] +1, trading[tom][from] - 1 연산을 하여

 

서로 선물 교환을 누가 더 많이 했는지를 비교하기 위해 사용하고

 

tradePoint는 두 사람이 선물을 주고 받은 기록이 없거나 주고 받은 수가 같다면

 

두 사용자를 비교하기 위해 사용자의 선물 지수를 기록하는 변수이다.

 

아래는 구현 코드인데, 채점 결과 통과는 되었지만 코드 개선의 여지가 있는 부분은

 

중복되는 연산을 제거하기 위해 코드 아래쪽에 위치한 이중for문에서 j의 시작값은 i+1이 되는 것이 시간 단축에 도움이 된다.

 

 

import java.io.*;
import java.util.*;


class Solution {
    int answer;
    int trading[][];
    int tradePoint[];
    HashMap<String, Integer> matching;
    
    public int solution(String[] friends, String[] gifts) {
        answer = 0;
        
        matching = new HashMap<>();
        trading = new int[friends.length][friends.length];
        tradePoint = new int[friends.length];
        StringTokenizer st;
        
        for(int i=0;i<friends.length;i++){
            matching.put(friends[i],i);
        }
        
        for(int i=0;i<gifts.length;i++){
            st = new StringTokenizer(gifts[i]);
            
            int from = matching.get(st.nextToken());
            int to = matching.get(st.nextToken());
                        
            trading[from][to]++;
            trading[to][from]--;
            tradePoint[from]++;
            tradePoint[to]--;
        }
       
        int max = 0;
        for(int i=0;i<friends.length;i++){
            int cnt = 0;
            for(int j=0;j<friends.length;j++){
                if(trading[i][j]>0){
                    System.out.println(i+" "+j+" "+trading[i][j]);
                    cnt++;
                }
                else if(trading[i][j]==0 && tradePoint[i]>tradePoint[j]){
                    cnt++;
                }
            }
            
            max = Math.max(max,cnt);
        }
        
        return max;
    }
}