[leetcode] 468. Validate IP Address

반응형

문제

주어진 문자열이 유효한 IPv4 형식인지 유효한 IPv6 형식인지 확인하는 문제이다.


풀이

주어진 문자열이 특정한 구분자로 나눠지는 확인하고

dot(.) 3개로 구분되어 있으면 IPv4로 간주하고 유효한 지 확인한다.

colon(:) 7개로 구분되어 있으면 IPv6로 간주하고 유효한 지 확인한다.

그 외의 경우는 “Neither” 를 반환한다.

유효한 IPv4 확인하는 방법은 dot(.)으로 나눈 substring 마다 아래의 경우를 확인한다.

  • 0-255 사이에 위치한 숫자여야 함
  • 0이 아닌 경우를 제외하면 0으로 시작하는 경우가 없어야 함

유효한 IPv6 확인하는 방법은 colon(:)으로 나눈 substring 마다 아래의 경우를 확인한다.

  • 길이가 1 이상 4 이하여야함
  • hexadecimal에 해당해야 함

 

코드

class Solution {

    public String validIPAddress(String queryIP) { 
        if (queryIP.chars().filter(c -> c == '.').count() == 3) {
            for (String target : queryIP.split("\\\\.",-1)) {
                if (target.length() == 0) {
                    return "Neither";
                }
                if (target.startsWith("0") && target.length() != 1) {
                    return "Neither";
                }
                if (!isNumeric(target) ||
                        0 > Integer.parseInt(target) || Integer.parseInt(target) > 255) {
                    return "Neither";
                }
            }
            return "IPv4";
        }

        if (queryIP.chars().filter(c -> c == ':').count() == 7) {
            for(String target : queryIP.split(":",-1)){
                if(target.length() == 0 ||target.length() > 4){
                    return "Neither";
                }

                for(char ch : target.toCharArray()){
                    if(Character.digit(ch,16) == -1){
                        return "Neither";
                    }
                }
            }
            return "IPv6";
        }

        return "Neither";
    }

    public boolean isNumeric(String target) {
        if (target == null) {
            return false;
        }
        try {
            Integer.parseInt(target);
        } catch (NumberFormatException e) {
            return false;
        }
        return true;
    }
}
  • 공간 복잡도 : O(1)
  •  : O(n)

 

 


참고