전체 코드
using System;
using System.Linq;
using System.Collections.Generic;
public class Solution {
public int solution(int a, int b, int c, int d) {
int answer = 0;
List<int> inputList = new List<int>() {a, b, c, d};
List<int> countList = inputList.Distinct().ToList();
switch(countList.Count){
case 1: answer = a * 1111; break;
case 2:
int p2 = countList[0];
int q2 = countList[1];
int pCount = inputList.Where(n => n == p2).Count();
if(pCount == 3) answer = (10 * p2 + q2) * (10 * p2 + q2);
else if(pCount == 2) answer = (p2 + q2) * Math.Abs(p2 - q2);
else answer = (10 * q2 + p2) * (10 * q2 + p2);
break;
case 3:
List<int> duplication = inputList.GroupBy(x => x).Where(n => n.Count() > 1)
.Select(x => x.Key).ToList();
int p3 = duplication[0];
countList.Remove(p3);
int q3 = countList[0];
int r3 = countList[1];
answer = q3 * r3;
break;
case 4: answer = inputList.Min(); break;
}
return answer;
}
}
제한 사항
a, b, c, d는 1 이상 6 이하의 정수
문제 분석
제일 단순한 방법은 a, b, c, d의 값을 전부 비교하고 그 결과를 return하는 것이겠지만 가독성도 떨어지고 코드도 너무 복잡하여 다른 방법을 생각해봄.
a, b, c, d 중 몇 개나 서로 같은 값을 가지고 있는지 확인이 필요하므로 중복값을 제거하여 남은 요소들의 개수를 활용한다. 이 과정에서 고유값만 남긴 새로운 배열을 생성해주는 Distinct()함수를 사용한다. 입력 받은 a, b, c, d를 하나의 리스트에 넣은 후, Distinct를 통해 중복값을 제거한다. 이후 생성된 배열의 크기를 switch-case문의 condition으로 둔다.
List<int> inputList = new List<int>() {a, b, c, d};
List<int> countList = inputList.Distinct().ToList();
switch(countList.Count)
(1) countList.Count == 1
: 모든 눈이 p로 같음
중복값을 전부 제거하고 남는 요소는 오직 p뿐이다.
case 1: answer = a * 1111; break;
(2) countList.Count == 2
: 세 주사위의 눈이 p로 같음 / 두 주사위의 눈이 p로 같고, 나머지 두 개도 q로 같음.
case 2의 경우가 두 가지로 나뉘는 것에 주의해야 한다.
countList의 두 요소들이 각각 몇 개씩 존재하는지 if-else문으로 나누어 계산 후 어떤 경우에 해당하는지 판단한다.
case 2:
int p2 = countList[0];
int q2 = countList[1];
int pCount = inputList.Where(n => n == p2).Count();
if(pCount == 3) answer = (10 * p2 + q2) * (10 * p2 + q2);
else if(pCount == 2) answer = (p2 + q2) * Math.Abs(p2 - q2);
else answer = (10 * q2 + p2) * (10 * q2 + p2);
break;
(3) countList.Count == 3
: 두 주사위의 눈이 p로 같고, 나머지 두 개는 서로 다름 (q, r)
세 개의 요소 중 두 번 등장하는 p값이 어떤 것인지 알기 위해 a, b, c, d의 값을 group한 후 그 Count가 1보다 큰 것을 찾는다.
case 3:
List<int> duplication = inputList.GroupBy(x => x).Where(n => n.Count() > 1)
.Select(x => x.Key).ToList();
int p3 = duplication[0];
countList.Remove(p3);
int q3 = countList[0];
int r3 = countList[1];
answer = q3 * r3;
break;
(4) countList.Count == 4
: 전부 다름
case 4: answer = inputList.Min(); break;