1.Liskov Substitution Principle(LSP)는 OOP의 SOLID 원칙 중 하나로
base 클래스에서 파생된 클래스는 
base 클래스를 대체해서 사용할 수 있어야한다는 규칙이다.

예시를 들면
개라는 base 클래스에서 진돗개라는 클래스가 파생되었다면
개라는 base 클래스에서 할 수 있는 동작들을 모두 할 수 있어야 한다.
ex) 짖기, 물기, 꼬리흔들기 등

하지만 상속받은 클래스가 진돗개가 가 아닌 앵무새라면

개라는 base로 대체하려고 해도 개에는 존재하지 않는 메서드들이 존재한다.
ex) 쪼기, 날기 등
이걸 LSP 위반이라고 한다.

이러한 규칙은 상속이 다형성을 위해 사용될 수 있게 해준다.

@추가적으로 Overriding 및 Overloading에 대한 보충학습이 필요해보이지만
내일은 설날이라 일찍 출발해야 해서 차후 보충해야겠다.


(1).백준 9884 Euclid는 유클리드 호제법을 통해 최대공약수를 구하는 문제였다.
아쉬운 점은 호제법 설명이 제대로 되어있지 않기 때문에
문제를 보고 그대로 진행하는 것이 비효율이라는 점이다.

문제에는 max/min을 통해 a/b 순서를 지정하고
a-b를 반복하며 값이 같아질 때 까지 진행해야 하는 것 같은데

나머지를 제거하는 방향으로 하며 나머지가 0인 경우 while문을 멈추는 방식은
a/b 순서에 상관없이 자연스럽게 순서가 정리되기 때문에
(정리 후 b=a로 앞으로 오고 a%b의 나머지는 a이기 때문에 b=a가 된다)
아래와 같이 간단한 while문으로 GCD(최대공약수)를 구할 수 있으며
a*b/GCD를 통해 LCM을 구할 수 있다.

다만 a*b/GCD가 아닌 (a/GCD)*b와 같은 순서로 진행하는 것이 좋은데
결과는 BigInt가 되지 않더라도 a*b에서 BigInt를 초과할 가능성이 있기 때문에
숫자 값을 처리할 때는 나누기를 먼저 처리하는 것이 좋다.

다만 이런 처리 방식은 최대공약수라 소수점으로 내려가지 않기 때문에 가능하며
일반적인 계산에서 나누기를 먼저 하면 값에 오차가 생길 수 있다.

let [num1, num2] = `108 30`.split(' ').map(Number)

while(num1%num2){
    const temp = num1
    num1 = num2
    num2 = temp%num2
}

console.log(num2)

+ Recent posts