본문 바로가기
코딩테스트

[프로그래머스] Lv1. 가장 많이 받은 선물 - Java

by CuckooBird 2024. 8. 17.

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

 

프로그래머스

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

programmers.co.kr

 

matrix에 들어가는 내용은 다음과 같습니다.

다만, 여기에서 String값으로 들어오는 이름은 Arrays.asList(friends).indexOf(이름); 을 통해 friends의 인덱스로 넣었다고 보면 됩니다.

 

gift_score은 선물 지수가 담길 배열로, matrix를 채우는 동안에 갱신됩니다. 보내는 사람은 +1, 받는 사람은 -1합니다. (선물 지수 계산 방법에 따라서)

 

expected_gifts에는 받을 선물을 넣어두었습니다. 이를 갱신하는 조건에는 문제에서 크게 두 가지로 나뉘었다는 것을 알 수 있습니다.

1. 선물을 주고 받았고, 주고 받은 선물의 개수가 동일하지 않은 경우 → 준 선물의 수가 더 많은 쪽이 받습니다.

2. 선물을 주고 받지 않았거나, 선물을 주고 받았으나 주고 받은 선물의 개수가 동일한 경우 → 선물 지수가 더 큰 쪽이 받습니다.

 

int idx 를 선언하여 해당 인덱스에 해당하는 expected_gifts를 갱신할 예정입니다. (코드를 줄이는데 도움이 될 겁니다)

먼저 첫 번째 조건은 간단하게 matrix 상의 두 숫자가 같지 않으면 동작하도록 하여 idx에 더 큰 값을 집어넣습니다. → 준 선물이 더 많은 쪽이 받게 됩니다

두 번째 조건은 첫 번째 조건에서 else를 걸면 됩니다. 하지만 여기에서 예제 3번을 보면, 선물 지수가 같아서 0이 나왔다는 사실을 통해 같은 조건은 따로 걸어야 한다는 사실을 알게 됩니다. 따라서 먼저 선물 지수가 같은 경우는 continue로 보내고, 그 외의 경우에 삼항 연산자를 통해 선물지수가 더 큰 쪽에게 idx를 줍니다.

 

import java.util.*;

class Solution {
    public int solution(String[] friends, String[] gifts) {
        int answer = 0;
        int n = friends.length;
        int[][] matrix = new int[n][n];
        int[] gift_score = new int[n]; // 선물 지수
        
        for(int i=0; i<gifts.length; i++) {
            StringTokenizer st = new StringTokenizer(gifts[i], " ");
            String send = st.nextToken();
            String receive = st.nextToken();
            
            int send_idx = Arrays.asList(friends).indexOf(send);
            int receive_idx = Arrays.asList(friends).indexOf(receive);

            matrix[send_idx][receive_idx]+=1;
            gift_score[send_idx] += 1;
            gift_score[receive_idx] -= 1;
        }
        
        int[] expected_gifts = new int[n];
        for(int row=0; row<n-1; row++) {
            for(int col=row+1; col<n; col++) {
                int idx;
                // 주고받은 경우
                if(matrix[row][col] != matrix[col][row]) idx = matrix[row][col] > matrix[col][row] ? row:col;
                // 주고받지 않은 경우, 주고 받았지만 동점인 경우
                else {
                    // 선물 지수가 같은 경우
                    if(gift_score[row] == gift_score[col]) continue;  
                    else idx = gift_score[row] > gift_score[col] ? row:col;
                }
                expected_gifts[idx] += 1;
                answer = answer > expected_gifts[idx] ? answer : expected_gifts[idx];
            }
        }
        
        return answer;
    }
}

 


회고

프로그래머스 문제는 오랜만이네요. 코딩테스트를 지금껏 조금 여유있게 준비했던 것 같아 이제 부터는 실전에 도입하고자 시작하게 되었습니다.

 

잔디 심기 챌린지를 열어주신 선배님께서 좋은 피드백을 주셔서 오늘부터는 조금 다른 방식으로 운영해보려고 합니다. 토요일과 일요일에는 프로그래머스 코딩테스트를 보고 평일에는 백준으로 부족한 알고리즘 실력을 올려야겠어요!

 

그런데 프로그래머스는 뭔가.. 블로그나 깃허브 쓰기가 애매하네요.. 문제 번호나 코드 메모리, 시간, 코드 길이 같은게 안 나와 있어서.. 좀 더 찾아봐야 할까봐요. 그래도 문제를 푼 다음에 다른 사람분들의 풀이를 볼 수 있다는 점은 큰 메리트라고 생각합니다!