문제 설명
숫자로 이루어진 문자열 t와 p가 주어질 때, t에서 p와 길이가 같은 부분문자열 중에서, 이 부분문자열이 나타내는 수가 p가 나타내는 수보다 작거나 같은 것이 나오는 횟수를 return하는 함수 solution을 완성하세요.
예를 들어, t="3141592"이고 p="271" 인 경우, t의 길이가 3인 부분 문자열은 314, 141, 415, 159, 592입니다. 이 문자열이 나타내는 수 중 271보다 작거나 같은 수는 141, 159 2개 입니다.
def solution(t, p):
answer = 0
length = len(p)
for i in range(len(t) - length + 1):
if int(t[i:i+length]) <= int(p):
answer += 1
return answer
📚 TIL - 프로그래머스 「크기가 작은 부분 문자열」
🎯 문제 설명
숫자로 이루어진 문자열 t에서 p와 길이가 같은 부분 문자열을 모두 찾는다.
찾은 부분 문자열을 숫자로 변환한 후, p보다 작거나 같은 개수를 구하는 문제이다.
💡 풀이 아이디어
문제를 처음 봤을 때는 어렵게 느껴졌지만, 핵심은 문자열을 일정한 길이로 잘라서 비교하는 것이었다.
① p의 길이 구하기
먼저 p의 길이를 구한다.
length = len(p)
예를 들어
p = "271"
이라면
length = 3
이 된다.
② 문자열 자르기
t를 length만큼 계속 잘라준다.
예)
t = "3141592"
↓
314
141
415
159
592
이처럼 한 글자씩 이동하면서 부분 문자열을 만든다.
t[i:i+length]
③ 숫자로 변환하여 비교하기
잘라낸 문자열은 문자(String)이므로 숫자로 변환해야 한다.
int(t[i:i+length])
그리고
if int(t[i:i+length]) <= int(p):
를 이용하여 p보다 작거나 같은지 확인한다.
조건을 만족하면
answer += 1
을 수행한다.
📝 코드
def solution(t, p):
answer = 0
length = len(p)
for i in range(len(t) - length + 1):
if int(t[i:i+length]) <= int(p):
answer += 1
return answer
🔍 코드 해석
length = len(p)
→ p의 길이를 저장한다.
for i in range(len(t) - length + 1):
→ t를 처음부터 끝까지 한 칸씩 이동하며 확인한다.
t[i:i+length]
→ length만큼 문자열을 잘라 부분 문자열을 만든다.
int(t[i:i+length])
→ 문자열을 숫자로 변환한다.
answer += 1
→ 조건을 만족하면 개수를 1 증가시킨다.
📖 예제 실행
t = "3141592"
p = "271"
| 314 | ❌ |
| 141 | ⭕ |
| 415 | ❌ |
| 159 | ⭕ |
| 592 | ❌ |
최종 결과
2
💬 오늘 배운 점
- 문자열도 **슬라이싱([:])**을 이용하면 원하는 길이만큼 쉽게 자를 수 있다.
- 숫자 비교를 위해서는 int()로 형 변환이 필요하다.
- 반복문과 슬라이싱을 함께 사용하면 문자열 탐색 문제를 효율적으로 해결할 수 있다.
- range(len(t) - len(p) + 1)은 부분 문자열을 만들 수 있는 마지막 시작 위치까지 반복하기 위해 사용한다.
1. 핵심내용 요약
오늘은 의사결정나무(Decision Tree)의 분할 기준인 지니지수(Gini Index)와 엔트로피(Entropy)에 대해 학습하였다. 두 지표 모두 데이터가 얼마나 섞여 있는지를 수치화하여 가장 좋은 분할을 찾기 위해 사용된다. 순수한 데이터일수록 지니지수와 엔트로피 값은 작아지며, 정상과 불량이 비슷한 비율로 섞여 있을수록 값이 커진다. 또한 엔트로피 공식에 사용되는 로그의 의미와 계산기에서 log₂(x)=log(x)/log(2)를 이용해 계산하는 방법도 함께 이해하였다.
2. 주요 포인트
- 의사결정나무는 데이터를 가장 잘 구분할 수 있는 기준을 선택하여 분할한다.
- 지니지수(Gini)는 데이터의 불순도를 측정하는 대표적인 지표이다.
- 엔트로피(Entropy)는 데이터의 불확실성과 혼합 정도를 측정하는 지표이다.
- 데이터가 한 클래스로만 이루어질수록 지니지수와 엔트로피는 0에 가까워진다.
- 엔트로피 계산 시 로그는 밑이 2인 로그(log₂)를 사용하며, 계산기에서는 log(x)/log(2)로 계산한다.
- 의사결정나무는 엔트로피 감소량(Information Gain) 또는 지니지수 감소량이 가장 큰 기준을 선택하여 분할한다.
3. 핵심개념
① 의사결정나무(Decision Tree)
데이터를 여러 조건으로 반복해서 나누며 최종적으로 하나의 클래스로 분류하는 머신러닝 알고리즘이다. 각 단계에서는 데이터를 가장 잘 구분할 수 있는 변수를 선택하며, 이를 위해 지니지수 또는 엔트로피를 사용한다.
② 지니지수(Gini Index)
데이터가 얼마나 섞여 있는지를 나타내는 지표이다. 같은 클래스만 존재하면 값은 0이 되며, 여러 클래스가 비슷한 비율로 섞여 있을수록 값이 증가한다.
③ 엔트로피(Entropy)
데이터의 불확실성을 나타내는 지표이다. 데이터가 한 종류로만 구성되면 엔트로피는 0이며, 두 클래스가 50:50으로 섞여 있을 때 가장 큰 값을 가진다.
예시)
- 정상 3개, 불량 1개
계산 과정
- 3/4 = 0.75
- 1/4 = 0.25
- log₂(0.75) = log(0.75) ÷ log(2) = -0.415
- log₂(0.25) = log(0.25) ÷ log(2) = -2
- 0.75×(-0.415) = -0.311
- 0.25×(-2) = -0.500
- (-0.311)+(-0.500)=-0.811
- 앞의 음수를 적용하면 0.811
4. 용어정리
- Decision Tree : 조건을 이용하여 데이터를 반복적으로 분할하는 머신러닝 모델
- Node : 데이터를 분할하는 지점
- Leaf Node : 더 이상 분할하지 않는 최종 노드
- Gini Index : 데이터의 불순도를 측정하는 지표
- Entropy : 데이터의 불확실성을 나타내는 지표
- Information Gain : 분할 전후 엔트로피 감소량
- log₂(x) : 밑이 2인 로그이며 계산기에서는 log(x)/log(2)로 계산
5. 오늘의 소감 및 인사이트
오늘은 의사결정나무의 핵심 개념인 지니지수와 엔트로피를 처음에는 공식만 보고 이해하기 어려웠지만, 정상과 불량의 비율을 확률로 바꾸어 계산하는 과정을 따라가면서 개념을 조금씩 이해할 수 있었다. 특히 엔트로피는 복잡한 공식을 암기하기보다 데이터가 얼마나 섞여 있는지를 나타내는 점수라는 관점에서 접근하니 이해가 쉬웠다. 또한 로그 계산은 직접 값을 유도하기보다 공학용 계산기에서 log(x)/log(2)를 이용한다는 점도 알게 되었다. 앞으로는 Information Gain이 어떻게 계산되어 최적의 분할 기준을 선택하는지까지 이어서 학습하면 의사결정나무 전체 구조를 이해하는 데 도움이 될 것 같다.