2024-11-14 / 최소공배수-최대공약수, 메소드 체이닝
데일리 루틴에서 최소공배수와, 최대공약수를 구하는 방법이 나왔는데
아예 어떻게 구하는지 몰라서 쳐봤더니 이런 게 나왔다.
a가 b보다 작을 때, b를 a로 나눈 나머지를 c라고 했을 때 b를c로 나눈 나머지 d가 0이 되는 순간의 c값이 최대공약수가 된다는 것이었다. 처음에 봤을 때 제대로 이해가 안가 대입법으로 구해보려했다.
12 72
72%12 = 0 이렇게되면 12가 최대공약수가 되고
23 84
84%23=15 니까 23%15=8, 15%8=1 8%1=0 여기는 최대공약수가 1이 되고
24 60
60%24=12 니까 24%12=0 이되서 12가 최대공약수가 된다.
최소공배수는 구하기 쉬웠다. 두 수를 곱한 후 최대공약수를 나누기만 하면 되었다.
이 조건을 만족하면서 구현하기 위해선 일단 a<b 조건을 만족하기 위해 두 수의 순서를 b가 더 크도록 정렬 해 주었다.
그 다음엔 나머지가 0이 되는 순간 반복문이 끝나도록 설정 해주었고, 위에 쓰던 temp를 c로 사용했다. 처음 돌 때는 a%b값을 c에 저장해둔 뒤 b%c=?를 해야했기에 c값을 b위치에 두고 b값을 c위치에 두어야만 했다.
이 식을 구성한 후에 최소공배수를 구할때 a*b 값을 구해야 된다는게 생각났고 최대공약수를 구하기 이전에 mulnm으로 구해주었다.
class Solution {
public int[] solution(int n, int m) {
int[] answer = new int[2];
int mulnm=n*m;
int temp=0;
if(n>m){
temp = n;
n = m;
m = temp;
}
while(n!=0){
temp = m%n;
if(temp==0){
answer[0]=n;
break;
}
m=n;
n=temp;
}//최대 공약수
answer[1]=mulnm/n;//최소 공배수
return answer;
}
}
메소드 체이닝
객체의 상태를 변경하는 메소드들이 자기 자신(this)를 반환하는 방식으로 구현되는 것이다.
A라는 클래스에 number라는 변수가 선언되어 있고 addnum이라는 메소드는 number 값에 인자로 받은 num 값을 더하는 구성으로 되어 있다.
A a = new A(); 로 선언한 후 입력받은 4 5 6 7의 합을 구하고 싶으면
int sum = a.addnum(4).addnum(5).addnum(6).addnum(7).getnumber(); //마지막은 getter 생성한 부분이며, addnum(7)에서 끝나게 되면 A 객체 형이기 때문에 int sum과는 형이 맞지 않는다.
메소드 체이닝을 하면 이런식으로 구현이 가능하다.
여기서 addnum의 반환값은 this(자기 자신 객체)여야 한다.