본문 바로가기

수능문제풀이

2025 수능 수학영역 풀이 - 공통문제 (12~15, 홀수형)

지난 번에 이어서 2025 수능 수학영역 문제를 푼다. 역시 Julia를 사용하고, 몇 몇 한계점들이 발견되었기 때문에 일단 수치적 안정성이 문제가 되는 문제들은 Symbolics를 활용하거나, Mathematica 풀이로 대체할 계획을 갖고 있다. 여기서 부터는 해설을 하는 것이 유의미하기 때문에 어느 정도 설명도 포함한다.

문제 12.

$a_1 = 2$ 인 수열 ${a_n}$ 과 $b_1 = 2$ 인 등차수열 ${b_n}$이 모든 자연수 $n$에 대하여
$$
\sum_{k=1}^n \frac{a_k}{b_{k+1}} = \frac{1}{2} n^2
$$
을 만족시킬 때, $\sum_{k=1}^5 a_k$의 값은?

Code
a_max_len = 5
b_max_len = 10

a = [(i==1 ? 2 : undef) for i in 1:a_max_len]
b = [(i==1 ? 2 : undef) for i in 1:b_max_len]

function find_diff_and_fillup_b!(a, b)
    n = 1
    b2 = a[1]/(1/2*n^2)
    b[2] = b2
    diff = b[2] - b[1]
    for i in 3:b_max_len
        b[i] = b[i-1] + diff
    end
end

function fillup_a!(a, b)
    for i in 2:a_max_len
        prev_sum = sum(a[1:i-1] ./ b[2:i])
        a[i] = (1/2*i^2 - prev_sum)*b[i+1]
    end
end

find_diff_and_fillup_b!(a, b)
fillup_a!(a, b)

ans = sum(a)
Output
120.0
설명
  • 초기에 $a, b$ 수열을 초항만 초기화를 하고 나머지는 undef로 초기화 하지 않은 상태로 둔다
  • find_diff_and_fillup_b 라는 함수는 문제에 주어진 합의 공식에 $n=1$을 대입해서 수열 $b$의 공차를 찾고, 수열 $b$를 채워넣는다.
  • fill_up_a 라는 함수는 채워진 $b$의 수열, 그리고 $a_{k-1}$ 까지 채워진 수열과 합의 공식을 사용하여 나머지 $a_k$ 항들을 순차적으로 채워나간다.

문제 13.

최고차항의 계수가 1인 삼차함수 $f(x)$가
$$
f(1) = f(2) = 0, f'(0) = -7
$$
을 만족시킨다. 원점 $O$와 점 $P(3, f(3))$에 대하여 선분 $OP$가 곡선 $y=f(x)$와 만나는 점 중 $P$가 아닌 점을 $Q$라 하자. 곡선 $y= f(x)$와 $y$축 및 선분 $OQ$로 둘러싸인 부분의 넓이를 $A$, 곡선 $y=f(x)$와 선분 $PQ$로 둘러싸인 부분의 넓이를 $B$라 할 때, $B-A$의 값은?

13번 그림

Code
using Roots

f(x, c) = (x - 1)*(x - 2)*(x - c)
g(c) = (x -> f(x, c))'

function area(f, a, b; N)
    # f must be a positive function
    discrete_range = [a + (b - a)*i/N for i in 1:N]
    sum(f.(discrete_range)) * (b - a)/N
end

gridsize = 1000
c_range = [-100*i/gridsize for i in 1:gridsize]
mapping_fn = x -> g(x)(0)
if (found_c_idx = findfirst(mapping_fn.(c_range) .== -7.0)) != nothing
    println("이거 완전 럭키비키잖아?") 
    found_c = c_range[found_c_idx]
    f(x) = f(x, found_c)

    # OP 직선의 방정식
    h(x) = f(3)/3 * x
    Qx = find_zero(x -> f(x) - h(x), (0, 2.999))

    B = area(x -> h(x) - f(x), Qx, 3; N=10000)
    A = area(x -> f(x) - h(x), 0, Qx; N=10000)
    ans = B - A
end
Output
이거 완전 럭키비키잖아?
11.25016833649726
설명
  • area는 수치적 적분을 하는 함수이고, area라고 이름을 지은 만큼 양의 함수 f에 대해서 계산하기를 기대한다. 뭐 물론 그렇게 안하고 그냥 적분 결과에 절댓값 씌우고 나중에 함수를 적용할 때에 부호 신경쓰지 않고 넣어도 된다.
  • 함수 $f$를 처음부터 위와 같은 형태로 쓴 이유는 해가 $1,2$일 때에 인수분해된 형태로 적는 것이 편하기 때문이고, 결정되지 않은 계수 $c$는 그림에서 보면 해가 음수이므로 음수의 범위에서 스캔한다.
  • "이거 완전 럭키비키잖아?" 를 쓴 이유는 사실 계수 $c$를 검사하는 루틴이 굉장히 빡빡하게 주어져있음에도 결과가 찾아졌기 때문이고, 해당하는 $c$ 계수를 얻는다면, 우리는 $OP$의 방정식을 결정할 수 있다.
  • $OP$의 방정식을 결정하고 난 뒤에는, solver library로 $Q$ 점의 $x$ 좌표를 결정한다.
  • 그 다음에는 두 함수의 차이를 수치적분 해주면 된다. 수치적분이라 오차가 있는데 정답지의 $11.25 \approx 41/4$ 정답지에 3번 골라주면 된다.

문제 14.

그림과 같이 삼각형 $ABC$에서 선분 $AB$ 위에 $\overline{AD}:\overline{DB} = 3:2$ 인 점 $D$를 잡고, 점 $A$를 중심으로 하고 점 $D$를 지나는 원을 $O$, 원 $O$와 선분 $AC$가 만나는 점을 $E$라 하자.

$\sin A: \sin C = 8:5$ 이고, 삼각형 $ADE$와 삼각형 $ABC$의 넓이의 비가 $9:35$이다. 삼각형 $ABC$의 외접원의 반지름의 길이가 $7$일 때, 원 $O$ 위의 점 $P$에 대하여 삼각형 $PBC$의 넓이의 최댓값은? (단, $\overline{AB} < \overline{AC}$)

14번 그림

Code
N = 100000
tol = 0.0001
R = 7
A_candidate = [π*i/N for i in 1:N]

function area_triangle(A, B, C)
    (x1, y1) = A
    (x2, y2) = B
    (x3, y3) = C
    0.5*abs(x1*(y2 - y3) + x2*(y3 - y1) + x3*(y1 - y2))
end

ans_list = [18 + 15*sqrt(3), 24 + 20*sqrt(3), 30 + 25*sqrt(3), 36+30*sqrt(3), 42+35*sqrt(3)]

for A in A_candidate
    C = asin(5*sin(A)/8)
    B = π - A - C
    AB = 2R*sin(C)
    AD = 3/5 * AB
    AE = AD
    AC = 2R*sin(B)
    ADE = AD * AE
    ABC = AB * AC
    if abs(ABC/35*9 - ADE) < tol && B > C && AB > 1
        θ_range = [2π*i/N for i in 1:N]
        Acoord = (0, 0)
        Pcoord(θ) = (AD*cos(θ), AD*sin(θ))
        Bcoord = (AB, 0)
        Ccoord = (AC*cos(A), AC*sin(A))
        PBC_Areas = (x -> area_triangle(Pcoord(x), Bcoord, Ccoord)).(θ_range)
        ans = maximum(PBC_Areas)
        println(ans)
        println(ans_list)
    end
end
Output
87.9615507069138
[43.98076211353316, 58.64101615137754, 73.30127018922192, 87.96152422706632, 102.6217782649107]
설명
  • 먼저 이 문제에서는 세 점의 좌표가 주어질 때에 삼각형의 넓이 공식은 사용했다. area_triangle에 구현되어있다.
  • 이 문제에서 한가지 더 사용한 기하학적 지식은 사인법칙이다. 외접원의 반지름 $R$이 주어질 때에 각$A$를 마주보는 변 $BC$의 길이는 $2R\sin A$로 주어진다.
  • 그렇게 하고 각 $A$를 변수로 두면 나머지 각 $B, C$는 문제에 주어진 조건으로 결정되고, $ABC$의 외접원의 반지름의 길이로부터 변의 길이는 모두 결정가능하다. 이 때에 $ADE : ABC \approx 9:35$를 갖는 각 $A$를 결정한다 (문제의 조건인 $AB < AC$는 제약사항으로 입력한다). 이 값은 대략적으로 결정해도 되는 것이 어차피 각도가 연속적인 상황에서 $9:35$를 대략적으로만 만족하면 답을 찾는 데에는 아무 문제가 없다.
  • 삼각형 $ABC$에 대한 모든 정보가 결정되고 나면, A의 좌표를 $(0, 0)$, $AD$ 직선을 x축으로 두고, 원을 매개화 해서 쓴다음 점 $P$를 원 주위를 따라 회전 하면서 $PBC$ 넓이가 최대를 갖는 값을 찾으면 끝난다.
  • 풀이에서 나온 답이 정답지 4번과 유효숫자 5개에서 일치한다.

문제 15

상수 $a ( a \neq 3\sqrt{5})$ 와 최고차항의 계수가 음수인 이차함수 $f(x)$에 대하여 함수
$$
g(x) = \begin{cases}
x^3 + ax^2 + 15x + 7 \qquad (x \leq 0) \\
f(x) \qquad (x > 0)
\end{cases}
$$
이 다음 조건을 만족시킨다.

(가) 함수 $g(x)$는 실수 전체의 집합에서 미분 가능하다.

(나) $x$에 대한 방정식 $g'(x) \times g'(x-4) = 0$ 의 서로 다른 실근의 개수는 4개이다.

$g(-2) + g(2)$의 값은?

Code
using Roots

# f(x) must be cx^2 + 15x + 7
function g_minus(x; a)
    @assert x ≤ 0
    x^3 + a*x^2 + 15x + 7
end

function g_plus(x; c)
    @assert x > 0
    c*x^2 + 15x + 7
end

function gprime_minus(x; a)
    @assert x ≤ 0
    3x^2 + 2*a*x + 15
end

function gprime_plus(x; c)
    @assert x > 0
    2*c*x + 15
end

function g(x; a, c)
    if x ≤ 0
        g_minus(x; a)
    else
        g_plus(x; c)
    end
end

function gprime(x; a, c)
    if x ≤ 0
        gprime_minus(x; a)
    else
        gprime_plus(x; c)
    end
end

max_a_square = 100
max_c_abs = 10
N = 16

a_pos = [sqrt(i) for i in 0:max_a_square]
a_neg = [-sqrt(i) for i in 1:max_a_square]
a_range = vcat(a_pos, a_neg)
c_range = [-max_c_abs*i/N for i in 1:N]


for a in a_range
    for c in c_range
        sol1_under_0 = find_zeros(x -> gprime_minus(x; a), (-100, 0))
        sol2_under_0 = find_zeros(x -> gprime_minus(x-4; a), (-100, 0))
        sol1_between_0_4 = find_zeros(x -> gprime_plus(x; c), (0.01, 4))
        sol2_between_0_4 = find_zeros(x -> gprime_minus(x-4; a), (0.01, 4))
        sol1_above_4 = find_zeros(x -> gprime_plus(x; c), (4.01, 100))
        sol2_above_4 = find_zeros(x -> gprime_plus(x-4; c), (4.01, 100))

        sol = vcat(sol1_under_0, sol2_under_0, sol1_between_0_4, sol2_between_0_4, sol1_above_4, sol2_above_4)
        sol = unique((x -> round(x, sigdigits=5)).(sol))

        if length(sol) == 4 && abs(a - 3*sqrt(5)) > 0.00001
            ans = g(-2; a, c) + g(2; a, c)
            println(ans)
        end
    end
end
Output
32.0
설명
  • 이 문제의 미분은 그냥 손으로 했다. 그리고 문제의 (가) 조건에서 연속성과 좌우미분 계수 같아야 하는 수학적 지식을 이용해서 처음부터 $f(x) = cx^2 + 15x +7$로 쓰고 시작했다.
  • 수치적 불안정성이 지금까지는 제일 돋보였던 문제다. numerical solver가 if문으로 분기하는 ggprime같은 함수들의 곱에서 풀이를 제대로 찾지 못하고 있었기 때문이다.
  • 그래서 해를 구하는 과정을 보면, 구간을 나누어 $(-100, 0), (0, 4), (4, 100)$ 구간에서 해를 구하고 그 갯수가 4개이면서 $a$가 $3\sqrt{5}$가 아닌 해를 고르면 된다. 중간에 round로 반올림을 하는 이유는 solver에서 나온 값이 0.9999999999 같은 숫자로 주어지면 그것을 그냥 1 이라고 퉁치기 위해서다.
  • 야매가 좀 있다. a_rangec_range가 야매인데, 지금 계수를 찾는 범위를 2차 방정식과 연관되어있을 수 있는 $a$의 계수에 대해서 sqrt 범위에서 찾고있고, c_range는 16분의 1 정확도까지 지니는 범위에서 찾고있다. 만약 위의 코드에서 솔루션이 안찾아졌으면 각각의 범위들을 확장해서 풀었을 것이다.
  • 위의 코드로는 답 찾는데 2.7초나 걸리는 문제다.

여기까지 수능 수학영역 객관식 공통문제들은 모두 풀어보았다. 확실히 수치적으로 푸는 데에 유리한 문제들이 있고 (13, 14번), 예전부터 수능에 자주 등장하던 절편화된 함수들에 대한 제약조건을 만족하는 계수를 찾아야하는 15번 같은 경우에는 무작정 돌리기에는 컴퓨터가 버거워한다. 인간이 지식으로 해의 범위를 줄여주면 되지만, 15번은 손으로 푸는게 압도적으로 빠를 것 같다.

다음 포스트에서는 단답형 공통문제들을 먼저 다루고, 그 다음에 선택영역 문제들을 풀 것이다.

반응형