byworld 님의 블로그

등차이면서 등비구간이 있고, 이후부터는 갈라질 수 있을까? (없다!) 본문

수학

등차이면서 등비구간이 있고, 이후부터는 갈라질 수 있을까? (없다!)

byworld 님의 블로그 2026. 5. 3. 16:59

프로그래머스 문제를 풀면서 갑자기 생각이 났다. 3개 수열 까지는 등차이면서 등비인데 이후는 등차나 등비가 갈라질 수 있을까? 처음에 나는 있다고 봐서 분기처리를 했다.

그런데 정말 그럴까? 궁금증이 생기면 가설을 검증해야지.

 

관련 문제

https://school.programmers.co.kr/learn/courses/30/lessons/120924

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

 

일단 그래프적으로 접근할 수도 있다. 하나는 공비가 0이상이면 지수함수(혹은 상수함수) * 상수 위의 점 하나는 직선 위의 점인데, 세점이 만나야한다. 근데 지수함수는 항상 이계도 함수가 양수로 유지되어 convex하기 때문에 많아야 두 점이 만난다. 다른 하나는 공비가 0보다 작을 때이니까  공비^2 차이나는 짝수 항 끼리는 지수함수가 성립한다. 다른 하나는 홀수항끼리 그 지수함수의 x축 대칭하는 그래프 위에서 만나야한다. 거기서 많이 만나야 3 점인데, 등차이려면 등간격이어야하지만 하나는 같은 그래프에서 만나야하므로 수열에서 경우의 수는 홀-짝, 짝-짝 이거나 짝-홀, 홀-홀 에서만 가능성이 있으므로 등간격이라는 조건에 어긋난다. n,m이 자연수라면 간격이 2m-1, 2n 인데, 다르기 때문에 불가능한 것이다.

 

그래프로 그리면 다음과 같다.

따라서 등비급수가 상수함수 위의 점일때만 등차와 등비가 동시에 성립한다.

 

이번에는 수식으로 하겠다. 이게 더 깔끔할 수도 있다.

일반적으로 초항을 a라고 하지만, 2번째 항을 a라고 하겠다. 공차를 d라고 하겠다.

등차중항 공식(직선 위의 점 이므로 중간에 있는 것이 평균)에 의해서 센터의 2배는 같은 거리에 떨어진 두 수의 합과 같다. 1,2,3항에 대해서는 다음과 같다.

2*a= a-d + a+d = 2*a

그리고 등비중항 공식에 의해서 같은 거리에 떨어진 두 수의 곱은 센터의 제곱과 같다.

a^2=(a/r)*(a*r) = a^2

 

그러면 이제 이 공식을 활용해서 연립해보겠다. 일단 공차니까 1,2,3항은 a-d, a, a+d이다. 그러면 이 내용에 대해서 등비중항이 성립하려면

a^2=(a-d)*(a+d) = a^2 - d^2 -> d^2=0, d=0

결국 그렇게 되려면 등차가 0이다. 그러면 상수함수라는 것이다.

 

그러면 등차와 등비 급수가 계속 된다. 등비는 1, 등차는 0으로. 

 

이전 코드

#include <string>
#include <vector>

using namespace std;

int solution(vector<int> common) {
    int answer = 0;
    if(common.size()==3){
        if(2*common[1]==common[0]+common[2]){
            return 2*common[2]-common[1];
        }else{
            return common[2]*common[2]/common[1];
        }
    }
    else{
        int n=common.size();
        if(2*common[1]==common[0]+common[2]&&2*common[2]==common[1]+common[3]){
            
            return 2*common[n-1]-common[n-2];
        }else{
            return common[n-1]*common[n-1]/common[n-2];
        }
    }
    return answer;
}

 

 

개선 코드

#include <string>
#include <vector>

using namespace std;

int solution(vector<int> common) {
    int answer = 0;
    int n=common.size();
    if(2*common[1]==common[0]+common[2]){
            answer= 2*common[n-1]-common[n-2];
        }else{
            answer= common[n-1]*common[n-1]/common[n-2];
        }
    return answer;
}

 

'수학' 카테고리의 다른 글

10*a+5의 제곱은? (+ 확장 (10*a+b) * (10*a+c), s.t. b+c=10)  (0) 2026.05.02
[수학] 사분원 반갈 각도 문제  (0) 2026.04.11
정규분포 꼴 적분  (0) 2026.03.27