[프로그래머스] 주사위 게임 3

박지예·2023년 10월 31일
0

코딩테스트

목록 보기
12/17

문제 링크
처음엔 단순한 if 문으로 풀었다 .

첫번째 시도

    public int solution(int a, int b, int c, int d)
    {
        if (a == b && b == c && c == d) return 1111 * a;

        int[] ints = new int[] { a, b, c, d };

        Array.Sort(ints);
        if (ints[0] != ints[1] && ints[1] != ints[2] && ints[2] != ints[3] && ints[0] != ints[3]) return ints.Min();


        if (ints[0] == ints[1] && ints[2] != ints[3] && ints[0] != ints[2] && ints[0] != ints[3])
            return ints[2] * ints[3];
        else if (ints[3] == ints[2] && ints[1] != ints[0] && ints[3] != ints[1] && ints[3] != ints[0])
            return ints[0] * ints[1];
        else if (ints[1] == ints[2] && ints[0] != ints[3] && ints[1] != ints[0] && ints[1] != ints[3])
            return ints[0] * ints[3];    


        if (ints[0] == ints[1] && ints[2] == ints[3])
            return (ints[0] + ints[2]) * Math.Abs(ints[0] - ints[2]);
        else if (ints[1] == ints[2] && ints[0] == ints[3])
            return (ints[1] + ints[0]) * Math.Abs(ints[1] - ints[0]);

        int p = 0;
        int q = 0;

        p = ints[0] == ints[1] ? ints[0] : ints[3];
        q = ints[0] == ints[1] ? ints[3] : ints[0];
            

        return (int)Math.Pow((10 * p + q),2);
    }

2번째 시도

다른 사람들 풀이에 Map을 사용했다는 글이 많아서 사용해 보기로 했다.

    public int solution(int a, int b, int c, int d)
    {
        int answer = 0;

        Dictionary<int,int> map = new Dictionary<int,int>();
        int[] ins = new int[] {a,b, c, d };
        Array.Sort(ins);
        for (int i = 0; i < ins.Length; i++)
        {
            if (map.ContainsKey(ins[i]))
            {
                map[ins[i]]++;
            }
            else
                map.Add(ins[i], 1);
        }


        int p = 0;
        int q = 0;

        switch (map.Count)
        {
            case 1:
                return 1111 * ins[0];
            case 2:

                if (map[ins[0]] == 2)
                {

                    p = ins[0];
                    q = ins[3];

                    return (p + q) * Math.Abs(p - q);

                }
                else
                {
                    int m = map.Aggregate((x, y) => x.Value > y.Value ? x : y).Key;
                    p = m;
                    q = map.FirstOrDefault(item => item.Value == 1).Key;

                    return (int)Math.Pow((10 * p + q), 2);
                }
            case 3:

                int max = map.Aggregate((x, y) => x.Value > y.Value ? x : y).Key;
                map.Remove(max);


                p = map.FirstOrDefault(item => item.Value == 1).Key;
                map.Remove(p);
                q = map.FirstOrDefault(item => item.Value == 1).Key;

                return q * p;
            case 4:
                return ins.Min();
            default:
                break;
        }

        return answer;
    }

Map 의 크기가 2개 나올때만 2가지의 경우가 있다. 그것만 설정해 주면 된다.
dictionary 의 FirstOrDefault 함수는 뒤에 설정한 조건에 따른 가장 첫번째의 요소를 반환한다.
dictionary 의 Aggregate 함수를 사용해서 가장 큰 value를 가지고 있는 요소의 key를 찾았다.

profile
언젠간 바다로 갈거야!🐋

0개의 댓글