https://leetcode.com/problems/compare-version-numbers/description/

코드설명

문자열(String) 을 활용합니다.

 

문제조건에 다음과 같읕 조건이 존재합니다.

"The value of the revision is its integer conversion ignoring leading zeros."

이 의미는 앞에 000 혹은 0 으로 이루어진 숫자문자열일경우 앞의 0은 모두 무시하고, 숫자를 새로 만든다는 의미입니다.

즉, "1.0001"과 "1.01"은 같은 버전입니다.

 

주의할점은 "[.]" 로 RegExpression을 넘겨야합니다. "."만 넘기게 되면, 자바에서 정규식에서 모든 문자와 매치라는 의미입니다. 그러므로 특수문자를 이스케이프 처리하기 위해 "\\." 을 사용하거나 "[.]" 를 사용합니다.

 

또, Leading Zero를 제거해주어야하는데, 저의 경우 Integer.parseInt로 변환하여서 처리했습니다.

다른 방법으로는, 000이 나오는 것이 존재한다면 그 이후의 값부터 substring을 하거나 새로운 문자열을 반환해서 처리하면 됩니다.

 

더 좋은 방식은, 문자열처리 함수 대신에 숫자만 입력된다는 점을 활용하여 각 버전별로 처리합니다.

코드

Split과 Integer.parseInt를 활용한 정답코드1입니다.

class Solution {
    public int compareVersion(String version1, String version2) {
        String[] v1Split = version1.split("[.]");
        String[] v2Split = version2.split("[.]");
        for(int i=0; i<Math.min(v1Split.length, v2Split.length); i++){
            int v1Num = Integer.parseInt(v1Split[i]);
            int v2Num = Integer.parseInt(v2Split[i]);
            if(v1Num < v2Num) return -1;
            else if(v1Num > v2Num) return 1;
        }

        if(v1Split.length < v2Split.length) {
            for(int i=v1Split.length; i<v2Split.length; i++){
                int v2Num = Integer.parseInt(v2Split[i]);
                if(v2Num != 0) return -1;
            }   
        }
        if(v1Split.length > v2Split.length) {
            for(int i=v2Split.length; i<v1Split.length; i++){
                int v1Num = Integer.parseInt(v1Split[i]);
                if(v1Num != 0) return 1;
            }   
        }

        return 0;
    }
}

 

버전이 '.' 으로 구분된다는 점과 숫자값에 '0'을 빼어서 숫자로 만들어 처리하는 정답코드2입니다.

class Solution {
    public int compareVersion(String version1, String version2) {
        int version1Idx = 0, version2Idx = 0;
        while(version1Idx < version1.length() || version2Idx < version2.length()){
            int version1Sum = 0, version2Sum = 0;

            while(version1Idx < version1.length() && version1.charAt(version1Idx) != '.'){
                version1Sum = version1Sum * 10 + version1.charAt(version1Idx++) - '0';
            }
            while(version2Idx < version2.length() && version2.charAt(version2Idx) != '.'){
                version2Sum = version2Sum * 10 + version2.charAt(version2Idx++) - '0';
            }
            if(version1Sum > version2Sum){
                return 1;
            }else if(version1Sum < version2Sum){
                return -1;
            }else {
                version1Idx++;
                version2Idx++;
            }
        }
        return 0;
    }
}

 

+ Recent posts