Leetcode에서 풀어본 것중에 좋은 문제라고 생각한 것들을 분야별로 추려보았다. 내가 생각하는 좋은 문제의 기준은 기본을 다루는지 여부다. 자료구조/알고리즘의 기본 개념과 동작을 훈련을 통해 익히고 개선할수 있는 문제가 좋은 문제라고 생각한다. 따라서 문제가 조잡하거나 난해하지않고, 풀이도 핵심 로직으로만 구현되는 심플할 수록 좋다. 다양한 방법으로 해결할수 있는 문제면 더 좋다. 코딩테스트가 지능테스트가 되어서는 안된다고 생각잔다. 순간의 번뜩이는 아이디어를 요구하는 문제나 고도의 수학적 증명기술을 필요로 하는 문제는 추천하기 어렵다.
참고
- 문제 우측에 난이도 표기를 했다([E] Easy / [M] Midium). 이 문서는 문제를 발견할 때마다 계속업데이트 할 예정이다.
참고할만한 글: 인지과학에 기반한 프로그래머의 기본기 훈련
목록
자료구조
알고리즘/테크닉
주어진 두 문자열이 isomorphic 하면 true 아니면 false 리턴. (문자열을 구성하는 charactor는 모든 ascii문자) -> 풀이
Input: s = "egg", t = "add"
Output: true
Input: s = "foo", t = "bar"
Output: false
Input: s = "paper", t = "title"
Output: true
Input: s = "13", t = "42"
Output: true
특정 index를 기준으로 이전/이후 배열값의 합이 동일한 index를 리턴하라. -> 풀이
Input: nums = [1,7,3,6,5,6]
Output: 3
Explanation: The pivot index is 3.
Left sum = nums[0] + nums[1] + nums[2] = 1 + 7 + 3 = 11
Right sum = nums[4] + nums[5] = 5 + 6 = 11
첫번째 문자열이 두번째 문자열의 subsequence인지 판단하기 -> 풀이
Input: s = "abc", t = "ahbgdc"
Output: true
중복된 값이 있는 정렬된 배열이 있을때, target값이 존재하는 범위를 리턴하라. 없다면 [-1,-1]을 리턴.
단, 시간복잡도는 O(log N)을 초과할 수 없다. -> 풀이
Input: nums = [5,7,7,8,8,10], target = 8
Output: [3,4]
링크드 리스트를 reverse하라. -> 풀이
주어진 두 정렬된 링크드 리스트를 합치기(정렬된 상태 유지) -> 풀이
링크드 리스트의 head만 주어진다. 만약 리스트에 사이클이 존재한다면 true를 리턴하고 사이클이 없다면 false를 리턴하라. -> 풀이
링크드 리스트의 head만 주어진다. 만약 리스트에 사이클이 존재한다면 사이클이 시작되는 노드를 리턴하라. 사이클이 없다면 NULL리턴. -> 풀이
Invert Binary Tree
Find Leaves of Binary Tree
Validate Binary Search Tree[M]
704. Binary Search
278. First Bad Version