문자열이 있다고 가정합니다. 주어진 입력이 유효한 IPv4 주소인지 IPv6 주소인지 또는 둘 다인지 확인해야 합니다.
IPv4 주소는 표준적으로 점으로 구분된 10진수 표기법으로 표시되며, 각각의 범위는 0에서 255까지이며 점(".")으로 구분된 4개의 10진수로 구성됩니다(예:192.168.254.1; 게다가 IPv4 주소의 선행 0은 유효하지 않습니다. 예를 들어, 주소 192.168.254.01은 유효하지 않습니다.
IPv6 주소는 4개의 16진수로 구성된 8개의 그룹으로 표시되며 각 그룹은 16비트를 나타냅니다. 그룹은 콜론(":")으로 구분됩니다. 예를 들어 주소가 2001:0db8:85a3:0000:0000:8a2e:0370:7334인 경우 유효한 주소입니다. 또한 4개의 16진수 숫자 중 일부 선행 0과 주소의 일부 소문자를 대문자로 생략할 수 있으므로 2001:db8:85a3:0:0:8A2E:0370:7334 이 주소도 유효합니다. /P>
그러나 단순성을 추구하기 위해 두 개의 연속적인 콜론(::)을 사용하여 값이 0인 연속적인 그룹을 하나의 빈 그룹으로 바꾸지 않습니다. 예를 들어 2001:0db8:85a3::8A2E:0370:7334는 잘못된 IPv6 주소입니다. 게다가 IPv6의 추가 선행 0도 유효하지 않습니다. 02001:0db8:85a3:0000:0000:8a2e:0370:7334 주소가 잘못되었습니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
-
checkv4(x) 메서드를 정의하면 x가 0에서 255 사이의 범위에 있는지 확인한 다음 true, 그렇지 않으면 false
-
checkv6(x) 메서드를 정의하면 다음과 같이 작동합니다. -
-
크기가 x> 4이면 false를 반환합니다.
-
x>=0 및 x[0]에 해당하는 10진수가 '-'가 아니면 true를 반환하고 그렇지 않으면 false를 반환합니다.
-
-
주요 방법에서
-
입력에 3개의 점이 있고 각 부분에 대해 checkv4(i)가 true이면 "IPv4"를 반환합니다.
-
입력에 7개의 콜론이 있고 각 부분에 대해 I checkv6(i)이 true이면 "IPv6"을 반환합니다.
예제(파이썬)
더 나은 이해를 위해 다음 구현을 살펴보겠습니다. −
class Solution(object): def validIPAddress(self, IP): """ :type IP: str :rtype: str """ def isIPv4(s): try: return str(int(s)) == s and 0 <= int(s) <= 255 except: return False def isIPv6(s): if len(s) > 4: return False try : return int(s, 16) >= 0 and s[0] != '-' except: return False if IP.count(".") == 3 and all(isIPv4(i) for i in IP.split(".")): return "IPv4" if IP.count(":") == 7 and all(isIPv6(i) for i in IP.split(":")): return "IPv6" return "Neither" ob = Solution() print(ob.validIPAddress("172.16.254.1"))
입력
"172.16.254.1"
출력
"IPv4"