항해를 수료하고 건강이 나빠져서 골골대다가 결국 수술까지 받게 되었다. 건강 관리에 너무 소홀했던 것 같다. 수술 후 심신이 많이 약해진 느낌이다. 건강이 최고..
MVC 패턴은 여러가지 디자인 패턴 중 하나이다. 디자인 패턴은 프로그램을 만들 때 상황에 따라 간편하게 적용해서 특정한 규약을 통해 쉽게 쓸 수 있는 형태로 만든 것이다.
여러 디자인 패턴 중 MVC 패턴은 애플리케이션를 구성할 때, MODEL, VIEW, CONTROLLER 세가지 역할로 구분한 패턴을 의미한다.
MODEL은 애플리케이션의 정보, 데이터, 데이터베이스 등을 지칭한다.
VIEW는 사용자에게 보여지는 화면, UI를 의미한다.
CONTROLLER는 MODEL과 VIEW를 제어해 둘이 서로 상호 통신을 하지 않도록 하는 역할을 한다.
https://school.programmers.co.kr/learn/courses/30/lessons/136798
이 문제에서 잘몰랐던 것은 약수의 개수를 효율적으로 구하는 방법이다. 몰랐다기 보다는 전에 공부를 해서 알고는 있었지만 체화가 되질 않아 잊어버렸다는 표현이 맞다.
어찌됐던 딱 떠오르는 대로 N의 약수의 개수를 구해보면,
int cnt = 0;
for (int i=1; i <= N; i++ {
if (N % i == 0) cnt++;
}
1부터 N까지 차례로 N과 나누어 떨어지는지 확인한 후, 나누어 떨어지면 약수의 개수를 올리는 형태의 코드이다.
이렇게 코드를 짜면 직관적이고 생각하기도 편하지만 숫자가 커지면 커질수록 시간복잡도가 증가하는 단점이 있다. 예를 들어 10000의 약수의 개수를 구하려고 한다면 for문을 10000번 돌아야만 한다.
시간복잡도를 낮추기 위해서는 다른 방법을 사용해야만 한다. 10000을 다시 예로 든다면 만일 10000에서 √10000 이후의 수를 나누었을 때 나누어 떨어지는 경우, 그 약수의 짝이 이미 약수이기 때문에 굳이 제곱근 이후의 수를 for문을 돌릴 필요가 없다.
그대신 약수의 개수를 더할 때 2를 더해야만 한다. 그리고 N이 제곱수인 경우에는 제곱근도 약수에 포함되므로 1을 더해야한다.
따라서 이 개념을 이용해서 다시 코드를 짠다면
int cnt = 0;
for (int i=1; i * i <= N) {
if (i * i = N) cnt++;
else if (N % i = 0) cnt += 2;
}