코딩 테스트/LeetCode

1742. Maximum Number of Balls in a Box (상자 안에 있는 공의 최대 개수)

포카리tea 2024. 10. 16. 16:26

lowLimit에서 HighLimit까지(즉, n == highLimit - lowLimit + 1)까지 번호가 매겨진 공이 n개이고, 1에서 무한대까지 번호가 매겨진 상자가 무한히 많은 공 공장에서 일하고 있습니다.

이 공장에서 하는 일은 공 번호의 자릿수의 합과 같은 숫자로 각 공을 상자에 넣는 것입니다. 예를 들어, 공 번호 321은 상자 번호 3 + 2 + 1 = 6에, 공 번호 10은 상자 번호 1 + 0 = 1에 넣습니다.

두 개의 정수 lowLimit과 highLimit이 주어지면 가장 많은 공을 가진 상자의 공 수를 반환합니다.

 

 

예시 1:

입력: lowLimit = 1, highLimit = 10
출력: 2
설명:
상자 번호: 1 2 3 4 5 6 7 8 9 10 11 ...
볼 수: 2 1 1 1 1 1 1 1 1 1 1 1 0 ...
상자 1에는 공이 2개로 가장 많은 공이 있습니다.

 

예시 2:

입력: lowLimit = 5, highLimit = 15
출력: 2
설명:
상자 번호: 1 2 3 4 5 6 7 8 9 10 11 ...
볼 수: 1 1 1 1 2 2 1 1 1 1 1 0 ...
상자 5와 상자 6에는 각각 2개의 공이 들어 있는 공이 가장 많습니다.

 

예시 3:

입력: lowLimit = 19, highLimit = 28
출력: 2
설명:
상자 번호: 1 2 3 4 5 6 7 8 9 10 11 ...
볼 수: 0 1 1 1 1 1 1 1 1 1 1 2 0 ...
10번 상자에는 공이 2개로 가장 많은 공이 있습니다.

 

 

조건:

  • 1 <= lowLimit <= highLimit <= 10^5

 

정답:

public class Solution {
    public int CountBalls(int lowLimit, int highLimit) {
        Dictionary<int, int> result = new Dictionary<int, int>();
        
        for (int i = lowLimit; i <= highLimit; i++)
        {
            int hap = 0;
            for (int j = 0; j < i.ToString().Length; j++)
            {
                hap += Int32.Parse(i.ToString()[j].ToString());
            }
            
            if (Array.IndexOf(result.Keys.ToArray(), hap) == -1)
            {
                result.Add(hap, 1);
            }
            else
            {
                result[hap] += 1;
            }
        }

        return result.Values.Max();
    }
}

해설각 자리수마다의 합이 동일하다면 동일한 상자에 공을 넣는 방식입니다.각 자리수의 합을 구하기 위하여 i를 string으로 변경 후 다시 int형으로 변경하고 hap에 더합니다.각 자리수의 합인 hap을 IndexOf를 이용하여 result.Keys에 존재하는지 확인하고 result.Keys에 존재하지 않는다면 hap과 개수인 1을 add해줍니다.만약 존재한다면 hap의 key값을 가진 result[hap]의 value에 1을 더해줍니다.

모두 다 돌면 result.Values 중에서 가장 큰 값을 return해줍니다.