728x90
https://www.acmicpc.net/problem/28692
23/08/21
선형 회귀는 너무 쉬워 시리즈의 두 번째 문제이다. 얼핏 보면 어려운 문제일 것 같지만, 문제만 잘 읽으면 쉽게 해결할 수 있다.
문제 접근 방식:
결국 $\sum (y_i - ax_i - b)^2$가 최소가 되도록 하는 $a$와 $b$의 값을 구하는 것이 우리의 목적이다.
이에 대한 답은 문제에 다음과 같이 나와있다.
$\sum x_i = S_x$, $\sum y_i = S_y$, $\sum {x_i}^2 = S_{xx}$, $\sum {x_i y_i} = S_{xy}$라고 한다면, 답은 다음과 같다.
${S_x}^2 \neq nS_{xx}$일 때의 답은 다음과 같다.
$$a = \frac{nS_{xy} - S_x S_y}{nS_{xx} - {S_x}^2}$$
$$b = \frac{S_y - aS_x}{n}$$
${S_x}^2 = nS_{xx}$일 때는 가능한 $a$와 $b$의 값이 여러 개이므로, EZPZ를 출력해 주면 된다.
아래는 내가 위의 접근 방식과 같이 작성한 파이썬 코드이다. 더 보기를 누르면 확인할 수 있다.
더보기
# 선형 회귀는 너무 쉬워 2
import sys
input = sys.stdin.readline
N = int(input())
S_x, S_y, S_xy, S_xx = 0, 0, 0, 0
for _ in range(N):
x_i, y_i = map(int, input().rstrip().split())
S_x += x_i
S_y += y_i
S_xy += x_i*y_i
S_xx += x_i*x_i
if S_x*S_x != N*S_xx:
a_2 = (N*S_xy - S_x*S_y)/(N*S_xx - S_x*S_x)
b_2 = (S_y - a_2*S_x)/N
print(a_2, b_2)
else:
print("EZPZ")
'알고리즘 > 백준 문제 풀이' 카테고리의 다른 글
[Python] 2206번 벽 부수고 이동하기 (0) | 2024.03.20 |
---|---|
[Python] 30961번 최솟값, 최댓값 (0) | 2024.03.18 |
[Python] 27295번 선형 회귀는 너무 쉬워 1 (0) | 2024.03.14 |
[Python] 30510번 토마에 함수 (0) | 2024.03.14 |
[Python] 31540번 도박 문제 전문 상담은 국번없이 1336 (0) | 2024.03.12 |