[LeetCode] 3451. Find Invalid IP Addresses

2025. 3. 10. 18:12SQL

🔗 문제 링크

https://leetcode.com/problems/find-invalid-ip-addresses/description/

 

🔓 문제 풀이

select ip,count(*) as invalid_count
from logs
where 
(substring_index(ip,".",1)>255
or substring_index(substring_index(ip,".",2),".",-1) >255
or substring_index(substring_index(ip,".",3),".",-1) >255
or substring_index(substring_index(ip,".",4),".",-1) >255)
or
(
left(substring_index(ip,".",1),1)=0
or left(substring_index(substring_index(ip,".",2),".",-1),1) =0
or left(substring_index(substring_index(ip,".",3),".",-1),1) =0
or left(substring_index(substring_index(ip,".",4),".",-1),1) =0
)
or length(ip)-length(replace(ip,'.',''))!=3
group by ip
order by count(*) desc,ip desc

 

log 기록에서 잘못된 ip address 개수 찾으면 된다.
sql에서 문자열을 잘 활용할 수 있는 지 물어보는 문제다.

문제 요구사항을 보면 
ip에서 
1. 각 옥탯(.을 제외한 숫자) 값이 0~255 범위에 있고
2. 각 옥탯이 0으로 시작하면 안되고
3. 옥탯의 개수가 4개여야한다.

그래서 ip 형식에 어긋나는 조건을 구했다.
1. 각 옥탯 값이 255를 넘는 값 구하기
substring_index(ip,".",1)>255
or substring_index(substring_index(ip,".",2),".",-1) >255
or substring_index(substring_index(ip,".",3),".",-1) >255
or substring_index(substring_index(ip,".",4),".",-1) >255

substring_index함수를 이용해 각 옥탯값을 구하고 값이 255를 초과하는 조건을 찾았다.
여기서 두번째 옥탯값을 구하려면 
substring_index(substring_index(ip,".",2),".",-1)
이렇게 먼저 substring_index(ip,".",2) 1~2번째 옥탯값(ex>192.168)을 구하고
substring_index(substring_index(ip,".",2),".",-1)
이렇게 substring_index함수의 -1으로 파라미터값으로 넘겨서 마지막 값(168)을 추출한다.

2. 각 옥탯이 0으로 시작하는 값 구하기
위에서 구한값을 left함수로 1번째 자리를 추출했다.
그리고 0인 경우를 구했다.
left함수 말고도 where절에 not like '0%'(0으로 시작하지 않는~) 조건 써도 된다.

3. 옥탯의 개수가 4개여야한다.
점(.)의 개수가 3개인 경우를 찾으려고 했다.
length(ip)-length(replace(ip,'.',''))
(ip에서 .의 개수)=(ip의 전체깊이) - (.을 제외한 ip의 전체 길이)를 이용해서 구했다.

위에 구한거처럼 ip 조건에 적합하지 않은 경우의 수를 제거하고 ip로 그룹화해서 행의 개수를 카운팅했다.

 

 

✅ 사용 문법 정리

SUBSTRING_INDEX(string, delimiter, index)

: 구분자를 기준으로 문자열을 지정된 길이만큼 자릅니다.

 

LEFT(string, length)

: 왼쪽부터 지정된 길이만큼 자릅니다.

'SQL' 카테고리의 다른 글

[LeetCode] 601. Human Traffic of Stadium  (0) 2025.03.12
[LeetCode] 262. Trips and Users  (0) 2025.03.11
[LeetCode] 185. Department Top Three Salaries  (0) 2025.03.10
[SQL] 연습 문제 모음5  (0) 2025.03.10
[SQL] 문제 풀이 모음4  (0) 2025.03.06