미분 이론
미분을 학교에서 배우지 않은 사람으로서 해당 문제를 풀 때 어떻게 미분을 이해해서 풀었는 지를 정리해보겠습니다
미분은 위키에서 다음처럼 찾을 수 있는데
미분(한국 한자: 微分, 영어: derivative) 또는 도함수(한국 한자: 導函數)는 어떤 함수의 정의역 속 각 점에서 함숫값의 변화량과 독립 변숫값의 변화량 비의 극한 혹은 극한들로 치역이 구성되는 새로운 함수다.
어떤 함수의 순간 변화율 (미분계수)을 구하는 것을 의미하며 순간변화율은 독립 변수 x의 증분에 관한 함숫값 ƒ(x)의 증분의 비가 한없이 일정한 값에 가까워질 때 그 일정한 값, 즉 함수에서 변수 x값의 변화량에 관한 함숫값 ƒ(x)의 변화량 비가 한없이 일정한 값에 가까워질 때 그 일정한 값 dy/dx로 나타낸다.
이런 건 솔직히 눈에 안 들어오잖아요?
미분은 함수의 변화량입니다
현실에 대입해서 쉽게 생각하면 자동차가 특정 지점을 갈 때의 가속도를 의미합니다
함수 = 시간에 대한 속도
변화량 = 가속도인 셈이죠
물리학에서는 속도와 가속도라면
경제는 비용함수의 최적화
공학은 신호 처리 및 시스템 분석등
솔직히 잘은 모르지만 여러 가지로 쓰이는 것 같네
정리하자면
미분은 함수의 변화량이고
예를 들면, 직선의 기울기를 구할 때 쓰이는 개념과 유사합니다
기울기는 직선이 얼마나 가파르게 상승하거나 하강하는지를 나타냅니다. (얼마나 변화하는지)
그래서 함수의 미분은 그 함수의 그래프에서 한 점에 접한 선의 기울기를 구하는 것을 의미합니다
다음 이미지에서 접선 A와 접할 때 B의 기울기를 구하는 거죠
미분은 d/dx로 나타내며 이는 x에 대해 미분한다는 의미입니다
(※ 여기서 d/dx는 나누는 게 아닌 미분한다는 의미로 쓰이는 겁니다)
즉 f(x)에 대해 미분하면 아래처럼 나타냅니다
미분 규칙
미분으로 다항함수를 미분할 때 정의는 다음과 같습니다
상수 항의 미분 : 상수의 미분은 항상 0이다
멱 함수의 미분 : x의 n제곱의 함수를 미분하면 nx의 n-1 제곱이다
이를 통해 아래와 같은 다항 함수는 다음 방법으로 미분할 수 있습니다
순간적인 지점의 기울기를 어떻게 하나의 값으로 나타내냐고 물으실 수 있지만
제가 처음 들었던 의문이었습니다
수학에서는 극한이라는 걸 적용해서 그 값을 구한 것 같더군요
다음처럼 설명하고 있지만 아쉽게도 저는 이해를 못 했습니다.
아래 식에서 h는 두 점 사이의 변화량을 의미합니다.
식을 따라가다가 h를 극한을 적용해 0으로 만들니 위에서 적용했던 정의가 나오는 것 같습니다
코드 풀이
이제 위 미분 규칙을 코드로 풀어봅시다
사실 미분을 공부하기 위해 가져온 문제라서
위가 본문이고 이건 덤이죠
https://www.acmicpc.net/problem/15725
해당 문제는 최대 일차 일변수 문제라서
사실 미분이라기보단 문자 분석에 더 가까운 것 같습니다.
package main
import (
"fmt"
"strconv"
"strings"
)
func main() {
var input string
fmt.Scan(&input)
// 입력 문자열을 처리할 때 부호를 유지하도록 -를 +-로 변환
input = strings.ReplaceAll(input, "-", "+-")
// +로 나누어 파싱
// -6x-6 => +-6x+6 => [-6x, 6]
terms := strings.Split(input, "+")
coefficient := 0
for _, term := range terms {
if len(term) == 0 {
continue
}
// 나눈 항에서 x가 포함되는 지
if strings.Contains(term, "x") {
// x의 인덱스를 구하고
xIndex := strings.Index(term, "x")
if xIndex == 0 {
// xIndex가 0이면 계수가 없으니 일차 함수이므로 1로 설정
coefficient = 1
} else if xIndex == 1 && term[0] == '-' {
// xIndex가 1이고 term[0]이 -이면 계수가 0이므로 부호를 유지하고 -1로 설정
coefficient = -1
} else {
// 상수 항의 미분을 적용하지만
// 차수가 1이므로 계수만 추출하면 됨
coef, err := strconv.Atoi(term[:xIndex])
if err != nil {
fmt.Println("Error parsing coefficient:", err)
return
}
coefficient = coef
}
}
}
// 상수만 있는 경우 상수 항의 미분으로 0으로 출력
var result string
if coefficient != 0 {
result = fmt.Sprintf("%d", coefficient)
} else {
result = "0"
}
fmt.Println(result)
}
'Go Lang > Algorithm' 카테고리의 다른 글
[GoLang] 백준 1027번, 고층 건물 풀어보기 (3) | 2024.05.28 |
---|---|
[GoLang] 백준 1012번, 유기농 배추 풀어보기 (0) | 2024.05.13 |
[GoLang] 백준 1019번, 책 페이지 (0) | 2024.02.22 |
[GoLang] 백준 1007번, 벡터 매칭 (1) | 2024.02.18 |
[GoLang] 백준 1005번, ACM Craft(위상 정렬) (1) | 2024.02.11 |