SoftwareDo/알고리즘(코테)
leetcode 165. CompareVersionNumbers 풀이
휴보로
2024. 5. 3. 23:00
https://leetcode.com/problems/compare-version-numbers
문제
Input: version1 = "1.01", version2 = "1.001"
Output: 0
Input: version1 = "1.0", version2 = "1.0.0"
Output: 0
Input: version1 = "0.1", version2 = "1.1"
Output: -1
문자열로 된 버전을 비교하는 문제입니다.
1. 같으면 0, version1이 크면 1, version2가 크면2.
2. 01 001 00000001은 같은 1이다.
3. 숫자와 .만 들어간다.
4. version1과 version2의 길이는 <= 500
5. 숫자는 무조건 32비트 integer 이다. (Java 기준 4바이트 32비트인 int)
풀이
민망할 정도로 쉽습니다.
public int compareVersion(String version1, String version2) {
String[] stringArrVersion1 = version1.split("\\.");
String[] stringArrVersion2 = version2.split("\\.");
int minLength = Math.min(stringArrVersion1.length, stringArrVersion2.length);
for (int i = 0; i < minLength; i++) {
int v1 = Integer.parseInt(stringArrVersion1[i]);
int v2 = Integer.parseInt(stringArrVersion2[i]);
if (v1 > v2) {
return 1;
} else if (v1 < v2) {
return -1;
}
}
if (stringArrVersion1.length > stringArrVersion2.length) {
for (int i = minLength; i < stringArrVersion1.length; i++) {
if (Integer.parseInt(stringArrVersion1[i]) != 0) {
return 1;
}
}
} else {
for (int i = minLength; i < stringArrVersion2.length; i++) {
if (Integer.parseInt(stringArrVersion2[i]) != 0) {
return -1;
}
}
}
return 0;
}
조심해야하는 부분 1: String split 할 때 . 넣으면 안된다. \\. 이스케이프 해야합니다.
조심해야하는 부분 2: 1.0 1.0.0.1 은 1.0.0.1이 크다, 즉 1.0은 1.0.0.0 입니다.
쉬운 문제인데 좀 오래걸렸습니다. split 조심해야 했기 때문인데요
그리고 최초 구현할 때 max length를 구하고 length가 max length인, 0으로 초기화된 int arr에 string splt한걸 넣었습니다. 짧았던 원본 뒷자리를 전부 0으로 채워서 length가 같습니다.
하지만 새로운 int arr을 생성하므로 메모리를 더 차지합니다.
if 문이 늘어난 위 코드가 나은지, arr더 생성한 int arr이 맞는지는 확신이 서지는 않습니다만 if 차이가 크지 않아서 위 코드가 맞는 것 같습니다.