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;
}
}