Skip to content

Instantly share code, notes, and snippets.

@dongwooklee96
Created July 14, 2021 14:02
Show Gist options
  • Select an option

  • Save dongwooklee96/3fa9dec9aa3f58d69c667aab5eacb962 to your computer and use it in GitHub Desktop.

Select an option

Save dongwooklee96/3fa9dec9aa3f58d69c667aab5eacb962 to your computer and use it in GitHub Desktop.
2.5
"""
## 문제 : IPv4와 IPv6를 구분하는 로직을 구현하라.
## 제한 사항 (IPv4)
1. 점(.)으로 숫자를 구분한다.
2. 점(.)으로 구분된 숫자는 4개이다.
3. 각 숫자의 범위는 0으로 시작하는 숫자는 없다.
4. 0을 제외하고 0으로 시작하는 숫자는 없다.
- 01, 00, 0234과 같은 숫자는 유효하지 않다.
## 제한 사항 (IPv6)
1. 콜론(:)으로 숫자를 구분한다.
2. 콜론(:)으로 구분된 숫자는 8개이다.
3. 각 숫자는 16진수 0000에서 FFFF까지 (4자리 16진수이다.)
4. 각 숫자는 4자리를 채우기 위해 0으로 시작할 수 있다.
5. 0000의 경우에는 0으로 사용 가능하다.
6. 콜론(:) 사이의 숫자가 없으면 유효한 IPv6가 아님
7. 각 숫자는 4자리를 넝머서 사용할 수 없다.
## 아이디어 (Brute-Force)
1. 점(.)과 콜론(:)으로 IPV4의 확인인지 IPV6의 확인인지 구분
2. IPv4 확인
- 점(.)으로 문자열 리스트로 분리
- 분리된 리스트의 크기가 4인지 확인
- 각 문자열을 순회
- 문자열의 길이가 1 ~ 3인지 확인
- 해당 문자열이 '0'이라면 길이가 1인지 확인
- 해당 문자열이 숫자이고 255보다 작은지 확인
시간 복잡도
- O(L), L은 입력 문자열의 길이이다.
공간 복잡도
- O(1)
3. IPv6 확인
- 콜론 (:)으로 문자열 리스트로 분리
- 분리된 리스트의 크기가 8인지 확인
- 각 분리된 문자열의 길이가 0보다 크고, 4보다 작은지 검사
- 문자열의 각 문자가 모두 16진수 숫자 및 문자로 구성되어 있는지 확인
## 아이디어 (정규 표현식)
1. IPV4의 규칙을 따르는 정규 문법 구성
2. IPV6의 규칙을 따르는 정규 문법 구성
3. 정규 문법 실행 및 규칙 (IPv4, 혹은 IPv6) 반환
시간 복잡도
- O(1)
공간 복잡도
- O(1)
- O(1)
"""
import re
def validIpAddress(IP: str) -> str:
IPV4 = '(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])'
ipv4 = \
re.compile('r^({p}\.){{3}}{p}$'.format(p=IPV4))
if ipv4.match(IP):
return "IPv4"
IPV6 = '([0-9a-f]{1,4})'
ipv6 = \
re.compile(r'^({p}\:){{7}}{p}$'.format(p=IPV6),
re.IGNORECASE)
if ipv6.match(IP):
return "IPv6"
return "Neigher"
if __name__ == "__main__":
IP = "256.256.256.256"
print(validIpAddress(IP))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment