드디어 뿌셨다 !
public class Solution
{
public long[] solution(int n, int m)
{
// 최대공약수 겹치는 약수 중 소수를 곱한 값
// 12 = 1 2 3 4 6 12
// 30 = 1 2 3 5 6 10 15 30
// 12와 30의 최대 공약수는 2 * 3 = 6;
Divisor(n); // 99 - 1, 3, 9, 11, 33, 99
Divisor(m); // 90 - 1, 2, 3, 5, 6, 9, 10, 15, 18, 30, 45, 90
// 1, 3, 9가 공약수이니 추출하여서 제일 큰 9를 추출하자
List<int> num = new List<int>();
long GCDvisor = 0;
for (int i = 0; i < Divisor(n).Count; i++)
{
for (int j = 0; j < Divisor(m).Count; j++)
{
if (Divisor(n)[i] == Divisor(m)[j])
{
num.Add(Divisor(n)[i]); // 1, 3, 9 가 추출이 되네 뭐지;
}
}
}
GCDvisor += num.Max();
// 최소공배수 둘의 배수 중 겹치는 값중 가장 작은 값
// 12 = 24 36 48 60 || 2 * 2 * 3
// 30 = 60 || 2 * 3 * 5
// 12와 30의 최소공배수는 60;
// Multiple(n); // 6 - 2 3 1
// Multiple(m); // 4 - 2 2 1
// 2 2 3 1 을 추출해야 하는데...
// List<int> num2 = new List<int>();
long LCMultiple;
LCMultiple = (n * m) / GCDvisor;
//if (Multiple(n).Count >= Multiple(m).Count)
//{
// for (int i = 0; i < Multiple(n).Count; i++)
// {
// num2.Add(Multiple(n)[i]);
// }
// for (int i = 0; i < Multiple(m).Count; i++)
// {
// if (Multiple(n).Contains(Multiple(m)[i]) == false)
// {
// num2.Add(Multiple(m)[i]);
// }
// }
//}
//else
//{
// for (int i = 0; i < Multiple(m).Count; i++)
// {
// num2.Add(Multiple(m)[i]);
// }
// for (int i = 0; i < Multiple(n).Count; i++)
// {
// if (Multiple(m).Contains(Multiple(n)[i]) == false)
// {
// num2.Add(Multiple(n)[i]);
// }
// }
//}
//for (int i = 0; i < num2.Count; i++)
//{
// LCMultiple *= num2[i];
//}
long[] answer = new long[2] { GCDvisor, LCMultiple };
Console.WriteLine(GCDvisor);
Console.WriteLine(LCMultiple);
return answer;
}
public List<int> Divisor(int num)
{
List<int> listnum = new List<int>();
List<int> listDiv = new List<int>();
for (int i = 1; i <= num; i++)
{
if (num % i == 0)
{
listnum.Add(i);
}
}
//for (int k = 0; k < listnum.Count; k++)
//{
// if (listnum[k] / 1 == 1)
// {
// listDiv.Add(listnum[k]);
// }
// else if (listnum[k] / 2 == 1)
// {
// listDiv.Add(listnum[k]);
// }
//}
return listnum;
// return listDiv;
}
//public List<int> Multiple(int num)
//{
// List<int> multiple = new List<int>();
// while (true)
// {
// if (num % 2 == 0)
// {
// num = num / 2;
// multiple.Add(2);
// }
// else if (num % 3 == 0)
// {
// num = num / 3;
// multiple.Add(3);
// }
// else
// {
// multiple.Add(num);
// break;
// }
// }
// return multiple;
//}
}
공약수와 공배수를 구하는 메서드를 이용하여 풀고 있었으나 계속 풀리지가 않아서 고민하던 차에 팀원분들께 물어보니 최소공배수를 구하는 공식을 알려 주셨다... 거의 3일을 머리를 싸매고 고민한 문제였는데 코드 한 줄로 풀리다니 얼탱~
int gcd(int a, int b)
{
if (b == 0)
{
return a;
}
else
{
return gcd(b, a % b);
}
}
팀원분이 알려주신 유클리드 호제법. 이 코드 '딸깍'이면 약수가 구해진다고 한다. 얼탱 2트
접근 제한자란 C#의 모든 형식에 존재하는 접근 수준을 의미합니다. 사용 중인 어셈블리나 다른 어셈블리에서 형식 또는 멤버를 사용할 수 있는지 여부를 제어합니다.
public: 형식을 참조하는 어셈블리에서 모두 접근할 수 있습니다.
private: 같은 class, struct에서만 접근할 수 있습니다.
protected: 같은 class, 파생된 class에서 접근할 수 있습니다.
일단 계속 사용해오던 접근 제한자에 대해 작성할 수 있었다. 마이크로소프트에서 제공하는 C# 설명서를 보며 공부할 필요성이 있어 보인다.
필요한 사항
양손 애니메이션을 추가하기 위한 설계 방향
ToolItemData에 두 손 무기 장착 bool 값을 추가하여 두 손 무기 Equip이 되면 그것에 맞는 AnimationState가 실행이 되는 방향으로 생각 중이다.
그럼 WeaponPrefab에 ItemSO를 추가하고 bool값을 받아오게 해볼까?
ToolSystem.Equip() 메서드 실행 시 bool == true; 실행이 될까...?
두 손 무기 AnimationState는 기존의 State에 추가를 할 것이냐 아니면 새로 만들 것이냐 고민이 된다.
아직 작업 중...