Question
An IP address is a numerical label assigned to each device (e.g., computer, printer) participating in a computer network that uses the Internet Protocol for communication. There are two versions of the Internet protocol, and thus two versions of addresses. One of them is the IPv4 address.
Given a string, find out if it satisfies the IPv4 address naming rules
Example
For
inputString = "172.16.254.1"
, the output should beisIPv4Address(inputString) = true
;For
inputString = "172.316.254.1"
, the output should beisIPv4Address(inputString) = false
.316
is not in range[0, 255]
.For
inputString = ".254.255.0"
, the output should beisIPv4Address(inputString) = false
.There is no first number.
Input/Output
[execution time limit] 4 seconds (py3)
[input] string inputString
A string consisting of digits, full stops and lowercase English letters.
Guaranteed constraints:
1 ≤ inputString.length ≤ 30
.[output] boolean
true
ifinputString
satisfies the IPv4 address naming rules,false
otherwise.
MY_ANSWER
def isIPv4Address(inputString):
try:
ip_list =[i for i in inputString.split(".") if i != ""]
# 공백확인
space = len([i for i in inputString.split(".")]) == len([i for i in ip_list])
# 범위확인
range = len([i for i in ip_list if 0 <= int(i) <= 255]) == len(ip_list)
# 4개 부분 확인
length = len(ip_list) == 4
return (space and range and length)
except:
return False
일반적인 IPv4의 조건은 다음과 같다.
1. 4개의 부분으로 이루어진 숫자 값, 2. 0 ~ 255사이 숫자 값, 3. 공백인 부분이 없어야 한다.
처음에는 공백에 대한 생각(1번에 대한 조건)을 하지 못했다. IPv4 split할때 공백을 제외하고 받았기에 inputString = 0..1.0.0
경우 공백이 있음에도 ['0', '1', '0', '0']
4개의 부분으로 이루어졌다고 나타나게 된다. 이를 해결하기 위해 공백에 대한 조건을 따로 넣어주었다. (비효율적이다.)
- try / except을 사용한 이유 : IPv4에 문자가 포함되면 범위 확인 부분에서 에러가 발생, 에러가 나는 경우 False를 return하도록 만들었다.
Best_ANSWER
def isIPv4Address(s):
p = s.split('.')
return len(p) == 4 and all(n.isdigit() and 0 <= int(n) < 256 for n in p)
- 본인의 코드와 달리 공백인 부분도 split하여 p라는 변수에 넣어주었다. 그렇기에 n.isdigit( )으로 공백인지 여부를 확인 할 수 있다.