본문 바로가기

Leet Code

(11)
1721 Swapping Nodes in a Linked List 링크드 리스트에서 두 개의 노드를 교체하는 것을 구현하는 문제이다. 리스트의 앞에서 k번째, 뒤에서 k번째의 노드를 교체해야 하는데, 리스트의 맨 앞에서부터 리스트를 순회하면서 앞에서 k번째, 뒤에서 k번째 노드의 포인터를 저장하고, 각 포인터에 저장된 값을 교환하는 식으로 구현하였다. C++ 더보기 /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next) : val(x), next(next)..
1720 Decode XORed Array encode 배열의 N번째 원소와 decode 배열의 N - 1번째 원소와 XOR 연산을 수행해 encoded 배열의 N번째 원소를 만들어 주면 된다. 전에 XOR 연산과 Trie 이용해서 푸는 1707 때문에 살짝 트라우마 왔었는데, 생각할 거리도 없이 무척 간단하게 풀었다. 더보기 class Solution { public: vector decode(vector& encoded, int first) { vector res; res.push_back(first); int i = 0; for(auto v : encoded) res.push_back(v ^ res[i++]); return res; } }; 더보기 class Solution: def decode(self, encoded: List[int],..
239 Sliding Window Maximum 주어진 배열에서 window를 한 칸씩 옯겨가며 window의 최대 원소를 반환하는 문제이다. 입력이 크기 때문에 문제 이름대로 sliding window 방식으로 풀면 당연히 시간 초과가 나버린다. 그래서 이 문제에서는 앞, 뒤로 push, pop 연산을 수행할 수 있는 deque를 사용해야한다. deque로 배열을 순회하며 새로운 원소들을 넣어주는 데, 이때 새로 집어넣어 줄 원소가 deque의 원소보다 크면 deque를 완전히 비워준다. 그리고 deque에는 매번 window로 참조하지 않는 원소가 포함되면 그것도 빼주어야 하고 이를 위해 deque에는 배열의 인덱스를 넣어준다. 말로 적으면 간단하지만 첨할 때는 예외 처리에서 빼먹은 거 찾는 거에서 막혀서 첨에는 deque로 풀려다가 접고 이진트리..
1707 Maximum XOR With an Element From Array 이번 문제는 Trie 구조를 이용해서 푸는 문제인데, Trie로 푸는 알고리즘 문제는 처음이었고, 그래서 풀 때, 시간이 좀 걸렸었다. 문제는 nums 배열에서 Queries 배열의 각 query의 두 번째 원소보다 같거나 작은 원소들과 첫 번째 원소와 XOR 연산을 했을 때의 최댓값을 찾는 문제이다. 어떠한 수 n과 임의의 수에 대해 XOR연산을 할 때, 만약 임의의 수가 5(101)와 4(100)라면, 공통되는 부분인 10의 계산 결과를 저장할 수만 있다면, 2번 계산하지 않아도 될 것이다. 이 문제에서는 XOR연산의 이러한 점을 이용하여 비트 레벨에서 Trie구조를 만들어 문제를 풀 것이다. 일단 우리가 짤 Trie는 root가 상위 비트, child가 하위 비트인 Trie이다. 그래서 querie..
1706 Where Will the Ball Fall 이 문제도 조금 색다르긴 한데 어쨌든 전형적인 DFS 문제이다. C++ 더보기 class Solution { public: vector findBall(vector& grid) { vector res(grid[0].size()); for(size_t i = 0; i < res.size(); ++i){ size_t j = i, s = 0; while(res[i] == 0 && s < grid.size()){ if(grid[s][j] == 1){ if (j == res.size() - 1 || grid[s][j + 1] == -1) res[i] = -1; else{ ++j; ++s; } } else if (grid[s][j] == -1){ if (j == 0 || grid[s][j - 1] == 1) res..
1705 Maximum Number of Eaten Apples 이 문제는 먼저 썩는 사과 먼저 먹어야 하는 전형적인 우선순위 큐 문제이다. C++ 더보기 class Solution { public: int eatenApples(vector& apples, vector& days) { using mypair = pair; priority_queue pq; int cnt{}; size_t i; for(i = 0; i < apples.size() || !pq.empty(); ++i){ while(!pq.empty() && pq.top().first 0) pq.push(top); } else{ int offset = min(top.first - int(i), top.second); cnt += offset; i += offset - 1; } } } return cnt; }..
1704 Determine if String Halves Are Alike 이 문제는 주어진 문자열을 이등분한 후, 각 문자열에 포함된 모음의 수가 같으면 true를 반환하는 문제다 별다른 거 할 필요 없이 문제 그대로 구현하면 된다. C++ 더보기 class Solution { public: bool halvesAreAlike(string s) { map score; score['a'] = 1; score['e'] = 1; score['i'] = 1; score['o'] = 1; score['u'] = 1; score['A'] = 1; score['E'] = 1; score['I'] = 1; score['O'] = 1; score['U'] = 1; int a = 0, b = 0; for(size_t i = 0; i < s.length() / 2; ++i) a += score[..
1713 Minimum Operations to Make a Subsequence 이 문제는 주어진 배열 arr이 target을 subsequence로 만드는 배열로 되려면 몇 번의 insert를 수행해야 하는지를 묻는 문제이다. 최장 공통부분 배열로 생각하기 쉽지만 아쉽게도 그렇게 풀면 시간 초과가 걸린다. 그래서 이 문제는 주어진 배열 arr이 문자열이 아니라 숫자로 구성되어 있으며, target의 원소가 모두 1번만 나타난 것에 유의해서 최장 증가 부분 수열로 풀어야 한다. =============================== 여담으로 포스팅한 1710부터 1713까지는 위클리 콘테스트 222의 문제이다. 이 콘테스트 1등이 23분만에 다 풀었는데 이쯤 되면 ICPC 올솔 할 수 있으려나 ㅋㅋㅋㅋㅋㅋ C++ 더보기 class Solution { public: int minOp..

728x90