일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- Machine Learning
- 타입스크립트
- 프로세스
- 연결 리스트
- APOLLO
- 브라우저
- cors
- 이진탐색
- 웹팩
- RxJS
- 릿코드
- 해시테이블
- 자바스크립트
- C
- 자료구조
- 코딩테스트
- 알고리즘
- 프로그래머스
- 컨테이너
- 배열
- alexnet
- RT scheduling
- GraphQL
- vue3
- 스택
- 큐
- 포인터
- 프론트엔드
- pytorch
- 연결리스트
- Today
- Total
목록자료구조, 알고리즘 (48)
프린세스 다이어리

1. 접근 방법 (1) 리스트의 끝까지 재귀로 타고 들어간 다음, 끝에서부터 하나씩 돌아오면서 역순으로 노드를 연결해준다. (2) head.next가 마지막 노드인 경우는 head.next가 아무것도 가리키지 않는 상태이므로 head.next.next === NULL 이라고 볼 수 있다. 이 head.next를 이전 노드, 즉 head를 가리키도록 한다. head.next.next = head; (3) head는 더이상 head.next를 가리킬 필요가 없으므로 연결고리를 끊어준다. head.next = null; (4) 해당 단계를 마치면 이전 재귀 단계로 한 단계 돌아와 같은 방법으로 수행한다. 2. 전체 해답 /** * Definition for singly-linked list. * functio..

1. 접근 방법 (1) 종료조건이 있고 반복되는 연산이 있으므로 재귀로 풀 수 있다. (2) 앞에 두 노드를 바꾸고 + 나머지 리스트를 합친다. 그리고 그 나머지 리스트 중 앞에 두 노드를 바꾸고 + 나머지의 나머지 리스트를 합친다. 결국, 한 단계 내에서 수행할 연산은: 앞에 두 노드를 바꾸고 + 두번째 노드에 나머지 리스트를 합치는 작업이다. let temp = head.next; head.next = temp.next; temp.next = head; head.next = swapPairs(head.next) (3) 예외처리를 추가한다. 앞의 두 노드의 위치를 바꿀 필요가 없는 경우는 그냥 리턴해준다. if (head == null) return head; if (head.next == null) ..

문자열 뒤집기 문제. 1. 접근 방법 (1) 문제가 재귀 알고리즘 분류 안에 있고 + 내가 재귀를 공부해야 하고 + 각 반복적인 연산으로 특정 조건에 다다를 때까지 수행하면 되기 때문에 재귀로 접근한다. (2) 인덱스 양쪽 끝에서부터 원소를 교체해, 가운데 mid 지점으로 옮겨갈 때까지 재귀 수행 - 베이스 케이스: 왼쪽 인덱스가 가운데 인덱스보다 커지면 함수를 종료한다. - 점화식: 두 인덱스에 해당하는 값끼리 교체해 준다. 그리고 인덱스를 하나씩 옮겨준다. 2. 전체 해답 /** * @param {character[]} s * @return {void} Do not return anything, modify s in-place instead. */ var reverseString = function(..

1. 접근 방법 mid의 제곱이 바로 찾는 값이 되면 true를 반환하고, 이진탐색으로 left와 right를 옮겨가며 마지막까지 남은 mid값이 조건을 충족하지 않는다면 false를 반환한다. 2. 전체 풀이 /** * @param {number} num * @return {boolean} */ var isPerfectSquare = function(num) { if (num === 1) return 1; let left = 1; let right = Math.floor(num / 2); while (left

문제 링크 1. 접근 방법 (1) 이진탐색 분야로 구분돼 있으나 도무지 이진탐색이 떠오르지 않아 재귀로 풀었다. 연산을 쪼개어 작은 연산의 결과를 다음 연산에도 계속 쓰기 때문에 재귀가 잘 어울리는 문제다. (2) 분할정복의 원리를 이용하여 시간복잡도 O(logN)로 풀어낼 수 있다. 거듭제곱을 이용하여(x^4 * x^4 = x^8 이 되는 원리) 풀면 속도가 한 번 당 절반으로 줄어든다. 그냥 단순 반복문 O(N)으로 풀어도 되기는 하는데 주어지는 값의 범위가 너무 커지면 시간초과가 날 수 있다. n이 짝수면 절반으로 줄여서 제곱하고, n이 홀수면 1 뺀 값을 절반으로 줄여서 제곱한 후, 한 번 x를 추가로 곱해서 리턴한다. if (n % 2 === 0) { const answer = getPow(x,..

문제 링크 1. 접근 방법 (1) 주어지는 배열이 오름차순 정렬돼 있고, 특정 조건에 따라 피벗 값을 기준으로 검사 위치를 변경해가며 푸는 문제이므로 이진 탐색 문제다. (2) left는 나중에 slice할 범위의 왼쪽 끝 인덱스다. (3) right가 arr.length - k로 초기화되어 있는 이유는 left 인덱스로부터 k만큼 자르기 위해 가능한 최대 인덱스이기 때문이다. let left = 0; let right = arr.length - k; (4) left

문제 링크 두시간 가까이 걸림.. 1. 접근 방법 (1) 중복을 허용한 오름차순 배열이 주어지고 + O(logN) 시간복잡도로 풀으라고 했으며 + 피벗을 기준으로 왼쪽과 오른쪽의 값을 비교해야 하는 문제이므로 이진탐색으로 푼다. (2) getIndex 라는 함수를 만들어서, 배열, 타깃, isLeftArray를 파라미터로 받아 주어진 타깃 범위의 첫 인덱스 또는 범위의 마지막 인덱스를 리턴하도록 한다. const getIndex = (nums, target, isLeftIndex) => { if (nums.length === 0) return -1; let left = 0; let right = nums.length - 1; let mid = 0; if (isLeftIndex) { // ... } els..

문제 링크 이전 회전배열 탐색 문제 풀고 오니 핵쉬움 3분컷(문제 풀이 조건이 쉽게 주어지긴 했음) 1. 접근 방법 (1) mid 값이 mid - 1 값보다 작은 경우, 회전된 상태에서 mid값이 인덱스 0인 경우이므로 mid의 값을 반환한다. if (nums[mid - 1] > nums[mid]) return nums[mid]; (2) mid 기준 왼쪽이 정렬된 상태면 left를 mid + 1로 옮겨 준다, (3) mid 기준 오른쪽이 정렬된 상태면 right를 mid로 옮겨 준다. if (nums[0] < nums[mid]) { // 왼쪽이 정렬된 상태일 때 left = mid + 1; } else { // 오른쪽이 정렬된 상태일 때 right = mid; } (4) 주어지는 배열의 길이가 1이거나 ..