반응형

# 17. Letter Combinations of a Phone Number

각 문자가 '2-9' 정수로 이루어진 문자열이 주어졌을 때, 해당 버튼을 abc keyboard 에서 눌렀을 때 만들 수 있는 모든 경우를 구하는 문제

ex ) 2 - abc, 3 - def, ... 9 - wxyz

말 그대로 각 숫자 별로 출력 가능한 문자들이 정해져 있어 이 문자들의 조합을 만들도록 코드를 구현했다.

// 각 숫자 별로 입력 가능한 문자들 저장
string letters[10] = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};

vector<string> letterCombinations(string digits) {
    if (digits.empty()){
        return {};
    }
    vector<string> result;
    result.push_back("");

    for (auto digit : digits) {
        vector<string> tmp;
        for (auto s : result) {
            for (auto candidate : letters[digit - '0']) {
                tmp.push_back(s + candidate);
            }
        }
        result.swap(tmp);
    }
    return result;
}

# 18. 4 Sum

3 Sum 과 유사한 문제로, 정수형 배열이 주어졌을 때 a + b + c + d = target 값이 되는 a, b, c, d 의 조합을 찾는 문제

3 Sum 은 하나의 값만 정해놓고 left, right 인덱스 두 개로 탐색했지만 이 문제는 두 값을 정해놓고 left, right 인덱스 두 개로 탐색

vector<vector<int>> fourSum(vector<int>& nums, int target) {
    sort(nums.begin(), nums.end());
    vector<vector<int>> ans;

    for (int i = 0; i < nums.size(); i++) {
        int t1 = target - nums[i]; // 연산량을 줄이기 위해 앞에서 미리 계산
        for (int j = i + 1; j < nums.size(); j++) {
            int t2 = t1 - nums[j];
            int l = j + 1, r = nums.size() - 1;
            while (l < r) {
                int sum = nums[l] + nums[r];
                if (sum < t2) {
                    l++;
                }
                else if (sum > t2) {
                    r--;
                }
                else {
                    vector<int> v(4, 0);
                    v[0] = nums[i];
                    v[1] = nums[j];
                    v[2] = nums[l];
                    v[3] = nums[r];
                    ans.push_back(v);

                    while (l < r && nums[l] == v[2]){
                        l++;
                    }
                    while (l < r && nums[r] == v[3]){
                        r--;
                    }
                }
            }
            while (j < nums.size() - 1 && nums[j] == nums[j + 1]){
                j++;
            }
        }
        while (i < nums.size() - 1 && nums[i] == nums[i + 1]){
            i++;
        }
    }
    return ans;
}

# 19. Remove Nth Node From End of List

리스트가 주어졌을 때, n 번째 노드를 리스트에서 삭제하는 문제

Single Linked List 가 주어지기 때문에 단순히 뒤에서부터 n 개를 탐색할 수는 없었다.

대신 앞에서부터 탐색을 하되 총 노드의 개수를 저장하고 각각의 노드를 배열에 저장함으로써 뒤에서 n 번째 노드를 바로 찾고, 그 앞의 노드를 그 다음 노드로 연결하도록 했다.

ListNode* removeNthFromEnd(ListNode* head, int n) {
    ListNode *arr[31] = {0, }, *tmp, dummy;
    int size;
    dummy = ListNode(0, head);
    arr[0] = &dummy;

    for (tmp = head, size = 1; tmp != nullptr; tmp = tmp->next, size++) {
        arr[size] = tmp;
    }    
    if (size == 2) {
        return nullptr;
    }
    arr[size - n - 1]->next = arr[size - n + 1];
    return arr[0]->next;
}

'Algorithm > LeetCode' 카테고리의 다른 글

[LeetCode # 23 ~ 24] 문제 풀이  (0) 2021.03.19
[LeetCode # 20 ~ 22] 문제 풀이  (0) 2021.03.18
[LeetCode # 14 ~ 16] 문제 풀이  (0) 2021.03.09
[LeetCode # 11 ~ 13] 문제 풀이  (0) 2021.02.28
[LeetCode # 7 ~ 9] 문제 풀이  (0) 2021.02.26

+ Recent posts