주녘공부일지

[프로그래머스 C#] Lv.1 가장 많이 받은 선물 본문

CodingTest/Programmers Lv.1

[프로그래머스 C#] Lv.1 가장 많이 받은 선물

주녘 2024. 1. 4. 19:11

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

 

프로그래머스

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

programmers.co.kr

1. 정답코드 및 핵심 아이디어, 유의사항

입출력 예제에 나온 그대로 선물 지수 배열과 선물 현황 2차원 배열을 선언해 값을 세팅하고 친구가 받아야 하는 선물의 개수를 산출해 최대 값을 리턴하면 되는 문제

- 친구 이름을 key, index 값 value로 가지는 dict (선물 지수 배열과 선물 현황 배열의 인덱스 값 )

- 선물 지수 배열은 선물을 받으면 --연산, 선물을 주면 ++연산

- 선물 현황 배열은 [ 선물을 준 사람, 선물을 받은 사람 ] 의 개수를 알기 위한 2차원 배열

 

선물을 받아야하는 조건

- 내가 받은 선물보다 준 선물이 많은 경우

- 받은 선물과 준 선물의 개수가 같을 때, 선물 지수가 비교 대상 친구보다 더 낮은 경우

 

주석 참조

    using System;
    using System.Collections.Generic;

    public class Solution
    {
        public int solution(string[] friends, string[] gifts)
        {
            int answer = 0;

            var dict = new Dictionary<string, int>(); // 친구이름에 따른 인덱스 값
            for (int i = 0; i < friends.Length; i++)
                dict.Add(friends[i], i);

            var intArray = new int[friends.Length]; // 선물 지수 배열
            var giftArrays = new int[friends.Length, friends.Length]; // 선물 현황 배열 [준 사람, 받은 사람]

            // 선물 지수 배열과 선물 현환 배열에 값 세팅
            for (int i = 0; i < gifts.Length; i++)
            {
                string[] strs = gifts[i].Split(' '); // 0 : 준 사람, 1 : 받은 사람
                giftArrays[dict[strs[0]], dict[strs[1]]]++;
                intArray[dict[strs[0]]]--;
                intArray[dict[strs[1]]]++;
            }
            
            // 친구의 수만큼 순회 ( i : 현재 체크 중인 '나' )
            for (int i = 0; i < intArray.Length; i++)
            {
                int num = 0; // 선물 받은 개수
                // ( j : 나에게 선물을 줘야하는지 체크당하는 '친구' )
                for (int j = 0; j < intArray.Length; j++)
                {
                    if (i == j)
                        continue;

                    // 선물을 받아야 하는 조건
                    if (giftArrays[j, i] < giftArrays[i, j]
                      || (giftArrays[j, i] == giftArrays[i, j] && intArray[i] < intArray[j]))
                        num++;
                }
                
                // 최대 값이라면 최대 값 갱신
                if (answer < num)
                    answer = num;
            }

            return answer;
        }
    }