넘치게 채우기

[LeetCode] 165. Compare Version Numbers 본문

PS/LeetCode

[LeetCode] 165. Compare Version Numbers

riveroverflow 2024. 5. 3. 13:30
728x90
반응형

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

leetcode - Compare Version Numbers

문제 유형 : 문자열 처리, 투 포인터, 슬라이딩 윈도우

문제 난이도 : Medium

 

문제

Given two version numbers, version1 and version2, compare them.

Version numbers consist of one or more revisions joined by a dot '.'. Each revision consists of digits and may contain leading zeros. Every revision contains at least one character. Revisions are 0-indexed from left to right, with the leftmost revision being revision 0, the next revision being revision 1, and so on. For example 2.5.33 and 0.1 are valid version numbers.

To compare version numbers, compare their revisions in left-to-right order. Revisions are compared using their integer value ignoring any leading zeros. This means that revisions 1 and 001 are considered equal. If a version number does not specify a revision at an index, then treat the revision as 0. For example, version 1.0 is less than version 1.1 because their revision 0s are the same, but their revision 1s are 0 and 1 respectively, and 0 < 1.

Return the following:

  • If version1 < version2, return -1.
  • If version1 > version2, return 1.
  • Otherwise, return 0.

두 버전, version1과 version2가 주어진다. 둘을 비교하시오.

버전 번호는 .으로 구분되는 1개 또는 그 이상의 숫자들의 조합입니다.

0인덱스이고, .으로 구분된 한 덩어리를 리비전이라 합니다.

 

버전을 오른쪽방향으로 각 리비전 단위로 구분합니다.

맨 앞의 0은 무시가능합니다.

예를 들면, 1.1과 1.001은 같습니다.

 

가장 최상위 리비전(왼쪽)을 우선순위로 버전을 비교하시오.

version1이 더 크다면 1을,

version2가 더 크다면 2를 반환하시오.

같으면 0을 반환하시오.

 

풀이

간단하게, 각 문자열을 투 포인터를 이용하여 순차적으로 읽으면서, .단위로 숫자를 읽어 비교해나간다.

.을 기준으로 숫자을 읽어서 리비전을 읽고, 두 리비전을 비교해서 알맞게 처리하면 된다.

만약 두 버전을 다 읽고도 버전 비교가 되지 않는다면, 둘은 같은 버전이다.

 

코드

C++

class Solution {
public:
    int compareVersion(string version1, string version2) {
        int i = 0, j = 0;

        while(true) {
            bool b1 = false, b2 = false;
            int v1 = 0;
            int v2 = 0;
            while(i < version1.size() && version1[i] != '.') {
                v1 *= 10;
                v1 += version1[i] - '0';
                i++;
                b1 = true;
            }
            i++;

            while(j < version2.size() && version2[j] != '.') {
                v2 *= 10;
                v2 += version2[j] - '0';
                j++;
                b2 = true;
            }
            j++;

            if(v1 > v2) return 1;
            else if(v1 < v2) return -1;
            if(!b1 && !b2) return 0;
        }

        return 0;
    }
};
728x90
반응형