문제

풀이

정렬 + 투포인터 풀이

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        int len = nums.size();
        vector<pair<int, int>> vp;
        vp.reserve(len);
        
        for (int i = 0; i < len; ++i)
        {
            vp.emplace_back(nums[i], i);
        }
        
        sort(vp.begin(), vp.end());
        int l = 0;
        int r = len - 1;

        vector<int> v(2);
        while (l < r)
        {
            int nl = vp[l].first;
            int nr = vp[r].first;
            int sum = nl + nr;

            if (sum == target)
            {
                v[0] = vp[l].second;
                v[1] = vp[r].second;
                return v;
            }

            if (sum > target)
            {
                r--;
            }
            else
            {
                l++;
            }
        }

        v[0] = 1e9 + 1;
        v[1] = 1e9 + 1;
        return v;
    }
};

처음엔 이렇게 풀었다. 문제에서는 인덱스를 반환하기를 요구하기 때문에 pair가 들어가게 되어 난잡해보이는 부분도 있다.

해시맵 풀이

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        vector<int> v(2);
        unordered_map<int, int> m;
        for (int i = 0; i < nums.size(); ++i)
        {
            int num = nums[i];
            if (m.contains(target - num))
            {
                v[0] = m[target - num];
                v[1] = i;
                return v;
            }

            m[num] = i;
        }

        v[0] = -1;
        v[1] = -1;
        return v;
    }
};

AI 기능인 Leet를 통해 다른 접근 방식에 대한 힌트를 받아 작성한 풀이다. 훨씬 더 깔끔하다! nums[i]를 살펴볼 때, target - nums[i]nums내에 존재하는지만 빠르게 확인하는 것이다.

이 포스트는 달레 스터디(1주차)에서 진행한 Blind 75 문제집 풀이의 일부입니다.

댓글남기기