문자열을 모두 소문자로 변환시킨다. ➡️ toLowerCase() 사용문자열의 팰린드롬의 유효성을 판별하기 위해서 공백 , 특수문자를 제거하고 오직 영숫자만 남게 한다. ➡️ replaceAll 사용✅ 텍스트에서 원하는 조건과 일치하는 문자열을 찾아내거나, 원하는 조건
O(1)의 시간 복잡도를 가지는 추가 메모리만을 사용➡️ 기본 자료형을 사용하는 변수 새로운 한 배열을 생성하여 하나씩 옮긴 다음에 void 형이기 때문에 다시 옮겨주는 작업 (one-way)while 문을 이용하여 배열의 시작요소와 종료요소를 동시에 바꿔주는 작업 (
Problem Solve Letter-logs와 Digit-logs 를 identifier 로 분류하여 각각 letters, digits 의 List 에 추가한다. 각각의 List 의 정렬 Letter-logs 는 identifier 을 제외한 문자열을 오름차순으로
bannedi 은 소문자 영어로만 이루어져있다고 했으므로 paragraph 도 소문자로 치환해주고, 소문자를 제외한 값도 공백으로 처리한다. ➡️ toLowerCase() , replaceAll(\[^ a-z], " ")단어의 횟수를 세기 전, bannedi 문자열이
문자열 배열 strs 에서의 문자열 요소를 이루고 있는 문자 하나하나를 한 문자(charToStr)로 합쳐 분류하기 쉽게 사전식으로 정렬을 한다. (예, "eat" -> "e", "a", "t" -> "aet" )map 은 <구성하고 있는 사전식으로 정렬된 문자열
O(n^2) 의 방법으로 for문 두 번을 통해 i는 0 ~ nums.length-1 까지 j는 i+1 ~ nums.length-1 까지 순회하면서 배열 요소 하나하나를 합으로 구해 target 과 비교한다.Only one valid answer exists. 이기 때
이런 식으로 substring 을 조합해서 회문인지 여부를 판단하고 그 중 가장 긴 회문을 리턴하는 방식이다. 하지만 이것은 O(n^2) \* n = O(n^3) 이라 time Limit 에 걸리고 만다.회문판별하는 것은 같은데 이제 substring 조합하는 부분에서
for 문 두 번 돌면서 현재 사서 다음 팔 떄 수익을 max 로 두고 반환한다.201번째인가 부터 time limit 이 떴고 O(n^2)가 되지 않는 방법을 찾아본다. 수익이 가장 많이 남으려면 최저점에서 사고 최고점에서 팔아야한다. 이때 min과 max 를 활용하
처음 생각했던 것은 Example 2 를 보고 numsi가 0일 경우의 수를 고려해보았다.일단 시작은 모든 배열의 곱 mul 을 구한다.1\. 모든 배열 값이 0인 경우2\. 아닌 경우 2-1. 배열 값이 0이 아닌 경우에는 mul/numsi 2-2. 배열 값이 0인
1, 2 모두 LinkedList 를 이용하였고1은 palidorme 여부를 확인하기 위한 앞 , 뒤부분을 분리하여 두 LinkedList 를 생성했고2는 한 LinkedList 를 생성하여 two pointer 를 이용했다.LinkedList 보다는 ArrayList
iterative 방식두 list 의 대소를 비교하면서 최종 반환 노드에 추가시켜줌➡️ result와 head, temp 를 쓰는 것과 return 시 head.next 를 해주는 것 : list1나 list2를 아예 대입을 시켜버리면 뒤의 노드들까지 다 복사가 되는
stack 이용val 만 stack에 추가해서 새로운 ListNode 에 stack.pop()을 추가iterative while문 하나로 reverse 하는 것인데 많은 변수를 사용해야하는 것이 어려운 이유이다. 이해하면 쉬워보이는데 스스로 하려고 하면 참 어렵다. ㄱ
여기서 중점은 while문의 sum!=0 조건이다.저 조건이 없을 시에 l1이나 l2의 노드 수만큼까지만 합이 계산된다. sum은 나머지로 값을 재할당해주기 때문에 sum이 0이 아닐때까지 이어져야한다. 이는 예제3에서 잘 보여주고 있다.9999999 + 9999 =
Problem Solve 아무리 봐도 적응이 안되는 재귀와 한창 c 주소 공부할 때의 next ,,, 어렵다 어렵다
먼저 odd와 even 을 먼저 할당해주고 while문에서 next.next 로 따로 노드들을 저장한다.이전에도 의문이었던 while문 조건에서 odd!=null || odd.next!=null 이 아닌 이유는 even의 ㅜnext 를 나중에 지정해주기 때문에 아마도
문자열을 배열로 만들고 각각의 문자들을 stack에 push/add 하는데, 만약 stack.peek()의 값과 현재 문자가 쌍이라면 pop()을 하고, 그렇지 않다면 그 문자를 push/add 한다.문자 배열을 다 순회 후, stack이 비지 않았다면 쌍이 완벽하지
Problem Solve 우리가 결론적으로 도출해야하는 값은 자기 자신보다 큰 온도가 등장했을 때의 날짜 차이이다. 즉, 인덱스 차이라고 할 수 있다. 따라서 인덱스와 온도값을 비교해야 하므로 stack 에는 Index 값으로 처리할 수 있게 하고, peek 값을
이 또한 monotone stack 을 이용한 풀이였지만,문제에서 lexicographical order 사전식순으로 결과값은 정해져있다고 했다.이 사전식순이란 무엇인가하니, cbacdcbc = adbccbacdcbc = adcbcbacdcbc = badccbacdcb
두 가지 stack 을 이용하는데 실제적인 queue로 생각하는 stack과 이를 반대로 바꾸어줄 임시적인 저장공간인 stack 을 이용한다.
거꾸로 생각하면 되는데, pop과 top에서 반복되는 것들이 많기 때문에 stack을 이용해 queue를 구현하는 것처럼 push에서 한 작업만 하면 pop,top에서 한 줄 코드로 값을 반환할 수 있다.따라서 queue는 앞에서만 poll 혹은 remove 를 할 수
처음은 쉽게 LinkedList 로 구현하고자 했는데, 크기가 정해지지 않은 부분이다보니 Error 가 발생했다.아주 원초적인 배열로 접근했고, 추가 인덱스를 rear, 삭제 인덱스를 front 로 지정했다.추가할 때마다 rear+1 하되 원형이기 때문에 size만큼
Problem Solve
put 할 때 기존의 키가 있다면 새로운 값으로 변경get 할 때 기존의 키가 없다면 -1, 있다면 키와 대응하는 값 반환
문자열 stones 의 문자하나하나가 문자열 jewels 이 가지고 있는 문자가 몇 개 있는지 확인하기 위해서는 HashMap을 이용하거나 그냥 문자열 메서드를 이용한다.배열이 조금 빠르긴 하다.
중복되지 않는 문자 조합을 만들어 길이를 매 for문을 돌 때마다 체크하여 반환한다.이 방법은 for문 두 개를 쓰므로써 O(n^2) 시간 복잡도 이기 때문에 굉장히 비효율적이다. 나름 커리큘럼에는 해시테이블을 이용하라고 하는데, 어떻게 사용할 수 있을까?중복 판단을
일반적인 큐를 확장한 것으로 키와 값의 체계를 사용한다. 큐의 구조인 FIFO(First In First Out)을 가지며, 우선순위를 정해 높은 우선순위를 가진 데이터가 먼저 나가는 자료구조이다.우선순위 큐에 저장할 객체는 필수적으로 Comparable Interfa
Problem Solve 2차원 배열을 순회하면서 1, 즉 섬을 발견하면 너비든, 깊이든 연결되어 있는 섬을 세고, 또 for문을 통해 순회를 하면서 동 떨어져 있는 넓게 분포되어 있는 섬을 찾는다. graph 문제로 BFS(Breadth-First-Search)
서로 다른 n 개 중 순서없이 r 개를 뽑는 것 , 일종의 dfs 를 이용한 재귀이자 백트래킹중복은 허용되지 않아, visited 로 방문여부를 체크한다.방문하지 않은 인덱스를 방문했다고 체크하고 현재 원소보다 뒤의 원소에 대한 탐색을 하기 위해 start로 i+1,
서로 다른 n 개 중 순서있게 r 개를 뽑은 것1,2 와 2,1 는 순서가 다르기 때문에 순열의 경우의 수에 모두 포함이 된다.순서가 다르기 때문에 현재 원소보다 앞선 원소도 다 순회하여야 한다. 그래서 start 인덱스를 파라미터로 전달할 필요없이 for문에서 항상
애를 먹었던 것은 먼저 digitsi의 range 가 2~9 라는 것을 파악하지 못하고 \`\`\`1, \*, 0, ➡️ 그치만 발견을 하고 2부터 9에 해당하는 문자들을 HashMap 에 추가하며 세팅을 해주었다.백트래킹을 이용한 조합을 이용했다. 이때 조합은 중복처
앞서 배웠던 백트래킹(조합)에서 중복을 허용하는 기능을 추가한 것이다.중복 허용을 하나 순서는 없는 index 처리 ➡️ 순열은 아닌 중복 조합이다. 즉 2,2,3이나 2,3,2, 3,2,2 는 같다는 것! 그렇기 때문에 index 는 현재 원소를 포함하기 때문에 그대
배열에서 가질 수 있는 모든 부분 집합 ➡️ 2^n 의 부분 집합의 개수를 가진다.\*\*중복 허용 x ➡️ 중복 체크 위해 배열 visited 를 사용했으나 어차피 backtracking 재귀를 통해 넘겨주는 인덱스 파라미터는 <span style="backgr
업로드중..항공권의 출발지와 목적지를 graph로 정리해주기위해 Map 을 이용한다. 여기서 목적지가 여러 개일 경우 lexical order 로 정렬된 채로 저장하기위해 우선순위큐 PriorityQueue 를 이용한다.항공권 정보를 정리된 graog 를 가지고 dfs
2차원 배열 prerequisites\[i] = \[ai, bi] 는 b를 선수 이수하여야 a를 들을 수 있다. 이를 그래프로 나타내면 b ➡️ a 로 나타낼 수 있다.그래프 표현을 위해 Map<Integer, List<Integer> graph 혹은 Lis
Problem Solve n 개의 노드와 times에는 간선의 정보가 담겨있고, k 노드에서 시작하는 간선의 정보를 탐색한다. 일단 n 과 times 로 그래프를 생성한다. 로 전체적인 그래프를 형성한다. 리스트 graph 의 각각의 index 는 해당 노드가 연
그 이전에 풀었던 Leetcode_743_Network_Delay_Time 의 최단 경로 구하는 다익스트라 알고리즘을 사용하는 것에 환승조건이 추가된 것이다.매커니즘은 비슷하게 작동하게 해놓고 환승조건 k 이하로 최단경로를 찾는 것이라 while 문에 k 에 대한 조건
Problem Solve 일종의 DFS 알고리즘으로 현재 노드의 좌, 우로 각각 재귀적으로 푸는 문제 자기 자신의 깊이인 1과 아래 노드의 깊이를 다시 재귀하는데, 좌우의 깊이 중 최대값을 가져옴
최대깊이를 구하는 dfs 재귀 알고리즘을 활용해 지름을 구하는 문제이다.처음에 지름이라고 했을 때, 너비를 말하는 건가? 그렇기엔 dfs 를 쓰나 bfs 를 쓰나 깊이, 너비를 이용해서 그래프를 탐색하는 것이다. 이진트리에서 지름이란, 루트 노드를 중심으로 왼쪽의 최대
트리의 diameter 구하는 것처럼 재귀를 통해 자기 자신의 값과 자식이 있다면 각각 왼쪽 오른쪽 자식들의 값과 같은지 비교하여 각각의 diameter 를 증가시켜준다.재귀에서의 반환값은 양쪽 diameter 이다.전역변수인 path 는 각각 자식들의 값과 현재 값이
계속 해왔던 dfs 재귀를 이용해 left 와 right 를 root 에서 바꾸어주는 기능만 추가했다.다만 재귀에서 base 인 경우에는 root가 null일 때 null 을 반환한다.이를 refactoring 한 코드는invertTree 함수 자체가 dfs 로써 임시
또 다시 재귀다! 그치만 이번 전달인자는 두 개이다.그렇다면 base 는 세 가지로 나눌 수 있다.root1 과 root2 둘 다 null 인 경우 : null 반환root1 만 null 인 경우 : 아직 root2 가 존재하기 때문에 그대로 root2 반환root2
Problem Solve height-balanced 란, 왼쪽 오른쪽 subtree의 높이 차가 1이 초과하지 않는 이진 트리이다. <img src="https://velog.velcdn.com/images/jeongjwon/post/f0f22986-2813-4bc
MST 알고리즘이지만 가중치가 존재하지 않는 무방향 그래프높이가 최소인 트리가 되려면 가장 연결이 많은 노드가 루트가 되어야 한다.위에서 언급한 트리의 특성을 이용하여 차수(=간선의 개수) 배열을 생성한다.리프노드 (=차수가 1인 노드) 를 큐에 삽입하고 트리의 높이가
이진 탐색 트리 (Binary Search Tree) 는 모든 노드가 key라는 값을 가지고, 각 노드의 왼쪽 서브트리는 현재 그 노드의 값보다 작은 값을 가지고, 오른쪽 서브트리는 큰 값을 가진다. 따라서 재귀로 구현할 수 있어서 탐색하는데 매우 효율적이고 삽입이나
BST 의 자신의 왼쪽 트리는 자기 값보다 작고, 자신의 오른쪽 트리는 자기 값보다 큰 특징을 이용한다.재귀(DFS)를 이용해서 root.val 와 low, high 를 비교해간다. 예외는 root.val 가 low와 high 사이에 오도록 내려간다.root.val 가
Problem
정렬 알고리즘에는 여러가지가 있는데, 병합정렬 을 한 번 사용해보고자 한다.먼저, 병합정렬이란? 일종은 분할 정복 알고리즘으로 배열을 나눌 수 있는 최대한으로 쪼갠 후에 더이상 쪼갤 수 없을 때 즉, 배열의 길이가 하나일 때를 기점으로 정렬을 다시 하면서 정복해나가는
업로드중..그림에서 보는 것처럼 삽입정렬 은 정렬된 부분과 정렬되지 않은 부분으로 나누고, 정렬되지 않은 부분의 한 요소씩 정렬된 부분에서 삽입될 위치를 찾아 정렬하는 방식을 말한다. 배열의 첫번째 원소는 정렬된 부분으로 간주하여 두번째 요소를 왼쪽의 정렬된 부분에서