문제 링크
처음엔 단순한 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);
}
다른 사람들 풀이에 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를 찾았다.