배열의 마지막 요소를 반환하는 문제이다.다만 배열에 null, {} 등의 일정하지 않은 타입 형식이 있다는게 문제
함수는 n으로 정의되며 이후 호출될 때마다 1이 증가한 값이 반환되도록 설정하였음
Promise 객체를 생성하여, 일정 시간 후 resolve할 수 있는지 여부를 물어보는 문제였다
항상 javascript 내장 메서드인 reduce를 사용했는데, 직접 구현해보니 나쁘지 않았던 것 같다.
함수 배열을 역방향으로 누적하며 더하는 연산이기에 reduce 메서드를 활용하였음
javascript의 filter 메서드를 구현하는 함수였다.개인적으로 지난번 reduce 메서드 구현 때 보다는 확실히 쉬운듯
처음으로 코딩 테스트에서 generator를 사용해보았다generator에 대한 개념을 많이 익히게 되는 계기가 되었는데, while(true)로 yield할 경우 문제가 생기지 않고 제한없이 호출이 가능하다는 점이 놀라웠다.
중앙 노드를 구할 땐 가장 많은 간선이 연결된 노드가 중앙 노드라고는 당연히 생각했는데..성형 그래프에선 두개 이상의 간선이 연결된 그래프는 중앙 그래프라는 것을 망각했다..내 풀이뛰어난 풀이
간단한 함수 생성자를 선언해보는 문제이다.
지문이 굉장히 복잡하고 별로다.매우 간략하게 설명하자면 최종적으로 반환해야 하는 값은 그저 fn 함수에 매개변수 args를 모두 할당하면 끝이다.다만 여기에 한번만 호출하고 그 이후는 반환하지 않는 상태로 만들어야함
그저 Hello World를 반환하면 되는 문제구현해보았다.
lodash 라이브러리의 \_.chunk 함수를 사용하지 않고 배열을 청크 단위로 잘라 붙이는 문제이다.무엇보다 난 lodash와 같이 무거운 라이브러리 자체를 선호하지 않기에 평소에 구현해보아서 어렵지 않았음
js의 class를 원하는대로 다룰 수 있는가?가 관건인 문제이다.
그저 인자의 수만 반환하면 끝나는 문제이다.
처음 주어진 ToBeOrNotToBe 타입의 각 함수 반환 타입을 수정한다.의도하지 않은 결과는 throw new Error를 통해 {"error":"Not Equal"} 과 같은 메시지를 받을 수 있도록 한다.
그지같은 설명을 가진 문제였다.t만큼의 시간 후 args를 인자로 실행되는 함수 t를 정의함cancelFn의 이름의 취소 함수를 반환함
Promise를 await한 후 계산해야 한다는 지식이 있느냐를 물어보는 문제이다.연산속도가 빠르신 분 풀이를 보니 Promise.all을 사용하셨던데 그게 더 빠른 것 같았다.
sort에 주어진 함수를 적용시켜 우선순위를 적용시키는 문제이다. 정렬을 할 줄 아는지를 묻는 문제이다.
주요 포인트는, setInterval 이전 한 번 직접 호출하는 것이다.문제의 예를 보면 시작과 동시에 한번 호출하고 그 이후 t초 이후마다 호출하라고 되어있기 때문임.삽질했다 ㅜ
class 형에 아직도 약하다는 점을 깨달았다.메서드 체이닝을 구현하는 부분에서 new 연산자로 새 class를 만들 필요가 전혀 없이return this로 해결이 된다는 것을 뒤늦게 깨닳음..
주요 지식은, javascript에서 Array와 Object는 모두 Object이다.즉 Object 메서드를 모두 사용할 수 있음
class와 Map 자료형을 활용하여 풀이했음만료기간을 계산하는 로직 때문에 Object 자료형에 setTimeout을 했으나 왜인지 정상동작 하지 않아서 탐구해볼 예정
Map 객체에 Array.join 메서드를 통해 정의한 key값을 저장해두어 불필요 작업이 실행되지 않도록 한다.
달팽이 탐색의 문제이다. 주요 포인트는 풀이가 용이하도록 실제 보드와 같은 배열을 우선 만든 후에\+1, -1이 될 수 있도록 신호를 조절하며 모든 보드를 채우면 된다.
DFS를 구현하여 모든 요소를 순회하며 배열인 요소 중 n차원 까지의 요소들을 flat 하는 것을 요구하는 문제이다.
lodash의 \_.debounce()를 사용하지 않고 디바운싱을 구현해보았음주로 React 프로젝트의 아이디 자동 중복검사, 검색어 입력 등을 구현할 때 사용해봤는데해당 기능도 React.useTransition을 사용해서 이런 구조를 직접 만들어 보는 경험이 새로웠
주어진 키 값에 따른 group 메서드를 Array 형식에 지정하는 문제이다.
Promise.race를 써보기 좋은 예제이다.물론 Promise를 하나 등록해서, 해당 Promise 내부에 setTimeout을 통한 reject도 가능하겠지만 코드가 복잡해진다.
flat을 사용할지 dfs를 사용할지 고민하다 문제의 본 의도가 궁금해 힌트를 보았음yield\*을 통해 본인을 재귀적으로 호출할 수 있다는 정보를 알게되어 본 문제의 의도대로 풀이하였음
Please solve this without using the built-in Function.call method.call쓰지 말라했지 bind랑 apply 쓰지 말라곤 안 했으니까...라는 댓글이 베댓이다.
obj의 타입이 배열인지 객체인지만 구분하면 굉장히 간단한 문제이다.재귀함수 형식으로 호출해서 falsy한 값인지 판별하고 그대로 반환
Map 자료형을 활용하여 이벤트를 등록, 구독한다. 구독 취소의 경우 Set 자료형으로 더욱 유연하게 하시는 분들도 있던데 참고해보면 좋을듯
Promise.all을 사용하게 되면, 전체 함수를 실행하고 나온 결괏값 Promise만 할당해주면 해결될 문제이지만 구현해보는것이 목적
Map을 선언해 최종적인 정렬까지 진행하였음효율이 잘 나오는 코드들을 살펴보니 대체적으로 Object.assign등을 활용해 병합하는 것을 확인
instanceof 만으로 해결하려 했으나, 해당 코드는 원시타입primitive에는 의도한대로 동작하지 않는다는 점을 알게되었음, 추가로 객체가 해당 클래스의 메서드에 접근할 수 있다면 그 클래스의 인스턴스로 간주된다라는 지문을 발견하여 예외 처리를 모두 해주기로 함
Generator와 Promise의 형태를 잘 이해하고 있어야 풀이가 가능한 문제이다.주요 포인트는 모든 Generator 절차를 수행하기 이전에 취소 요청이 들어온다면 비동기 작업이 취소될 수 있도록 할 수 있는가 이다.
코드는 15자로 이루어져있으며, 인덱스가 반드시 채워져 있으므로 10의 자리를 의미하는 11번째 인덱스와 1의 자리를 의미하는 12번째 인덱스의 합이 60을 초과하는지 판별하면 된다.
인덱스를 정의해야하므로, 투 포인터의 합 계산 방법은 불가하며해시맵을 사용하면 O(n)의 시간 복잡도로 해결 가능하다.
노드간의 연결을 확인할 수 있는 실력을 가졌는지 판별할 수 있는 문제
해쉬맵을 사용하여 해당 알파벳이 등장한적이 있는지를 판별하고, 이미 등장한 알파벳이 나왔다면 시작점을 해당 알파벳의 인덱스로 부여한 후 재개한다시간복잡도는 O(n) 선형 그래프이다.
두 배열을 병합한 후 재정렬하고, 중앙값을 구해주면 된다.유의해야할 점은 병합된 배열의 길이가 1일 경우 짝수와 홀수를 떠나 해당 요소를 바로 반환하면 된다.
중앙 확장법을 이용한 풀이이다.주어진 인덱스로부터 확장하는 left와 right 값을 기준으로 펠린드롬을 비교하며 점차 확장해나가며 최대 길이의 펠린드롬을 찾게되는 구조이다,
지그 제그를 따라가며, 해당하는 Row에 문자열을 더한 후 최종적으로 해당 배열을 join해 반환하면 되는 문제이다.
가장 큰 문제는, 아마 변환 작업이 아닌 문제에 제시된 \-2의 31승, 2의 31승 - 1 의 범위에 부합하지 않으면 0이 반환되어야 한다는 조건인데내가 놓쳤던 포인트는 변환 이전이 아닌 변환 이후 해당 범위 존재 여부를 체크해야한다는 것이다.
문제 지문대로 각 번호 별 변환 과정을 진행해주면 된다.parseInt를 사용하지 않으면 꽤 골치아파지나 코테에서 해당 메서드를 막을건 아니니 사용해주면 되겠음
팰린드롬 문자열을 구하는 문제이다.길이를 2로 나누어 문자열의 절반을 기준으로 검사하거나 방식은 다양하게 많을 수 있으나 현재 문자열을 뒤집어 비교하는 방식으로 해결하였음\[...splitedX].reverse() 부분은 현재 브라우저에서 최신 메서드인 toRevers
처음엔 정말 정규 표현식으로 사용해서 매칭된 길이와 비교하려했으나 실패하였음그 이유는 테스트 케이스를 확인해보니, 정규 표현식과 비슷한 구조일 뿐 실제 정규 표현식이 p에 할당되는것이 아니라 오류가 발생하여 재귀적으로 패턴이 올바른지 검색하는 풀이를 사용하였음
투 포인터를 활용하기 좋은 문제이다.각 막대 간격을 통해 물의 양을 구한 후포인터를 이동해가며 최적의 해를 찾을 수 있다.
아래와 같이 풀이하여 문제를 해결할 수 있다.문제에서 상냥하게 4와 9가 포함된 1000 미만의 예시를 모두 잡아주기 때문에 복잡한 로직으로 접근할 필요가 없음
이전 문제와 비슷하게 로마 문자를 선언하고 해당 문자에 해당하는 인덱스에 수를 집어넣는다.해당 문제는 3999 까지의 로마 숫자가 입력으로 주어지기에 복잡한 풀이과정을 사용할 필요가 없음
너무나도 생각 없이 당연하게 풀었던 문제인데, 시간복잡도를 빠르게 줄이신 분들의 풀이를 보니 가장 짧은 문자열을 골라내어 풀이하는 것을 보고 충격을 많이 받았다.배울점이 많다는걸 느꼈음
정렬한 후 투 포인터를 활용하여 풀이하였음중요 포인트는 중복된 값이 답안으로 제출되면 안 되므로, 중복된 값을 포인터가 생략할 수 있도록 처리하였음
현재 값과 이전 등장했던 유사 값들의 합을 비교하여 가장 근접한 3가지 수를 찾도록 하였음투 포인터를 이용하는 점은 15번 문제 풀이와 대부분 유사함
백트레킹을 활용하여 어렵지 않게 구현할 수 있는 문제이다.현재 문자를 기준으로 가능한 조합을 모두 구하여 정답을 반환하면 해결된다.
3Sum 문제의 코드와 크게 다르지 않게 해결이 가능하다.투포인터를 사용하되, 확인해야하는 값이 4개이므로 1번째와 2번째 요소는 반복을 통해 찾도록 한다.이후 3번째와 4번째 인자를 투포인터를 활용하여 빠르게 탐색한다.
ListNode 클래스 구조를 이해하고 투 포인터의 개념을 활용하여 풀어야 하는 문제이다.클래스 구조에 길이를 구하는 메서드가 선언되어 있지 않으므로 첫번째 포인터로 진행하고 두번째 포인터는 n 만큼의 딜레이를 갖고 따라가며 특정 노드를 제거해야한다.
괄호의 올바름을 판단할 때는 모든 과로가 후입선출 될 수 있냐로 결정되기 때문에 stack 자료 구조를 사용하였음올바른 순서에 괄호가 위치해있는지 1차적으로 점검한 후 모든 괄호가 닫혔는지 최종적으로 판단하여 결과를 반환하였음
우선 노드의 다음 요소를 비교하며 하나의 노드로 이어질 수 있도록 정렬한다.두 노드 중 하나의 노드라도 끝까지 도달했다면, 남은 노드를 정렬된 노드에 그대로 붙인다.
백트레킹을 통해 해결하기 좋은 문제이다.특정 길이가 될 때까지 괄호를 열거나 닫는 가능한 모든 경우의 수를 탐색하여 결과 배열에 담아 반환한다.
ListNode를 병합하는 문제이다.모든 노드를 한번에 병합하려 생각하면 어려우니두 노드씩 묶어 병합하여 해결이 가능하다.
1번째 노드와 2번째 노드의 순서를 교환하면 되는 문제이다.복잡한 구현이 필요없이 재귀적으로 호출되게 풀이하였음즉 뒤에서부터 두 요소 씩 순서를 변경하여 초기 head를 마지막 교환하여 완료하는 방식
Node를 원하는 만큼 뒤집을 수 있는지 검증하는 문제이다.탐색은 기존과 동일하게 진행되며 중요 부분은 k 만큼의 배열을 뒤집는 과정이다.
고유한 요소의 수를 출력하면 되는 문제이다.Discussion을 확인하면 알 수 있지만 지문 자체가 굉장히 수준 낮을 뿐더러ex) 오름차 순을 non-decreasing order로 표현하는 등의 모호함정말 고유한 항목의 수를 반환하더라도 거지같은 테스트 케이스로 반려
해당 문제도 지문이 굉장히 명확하지 않은 편이여서 문제 해결이 생각보다 늦어졌다.문제에서 요하는 바는val로 주어진 수를 포함하지 않도록 배열을 재정렬 하고 그 수를 반환해야하는 것이다.
haystack의 문자열에서 needle이 등장하는 인덱스를 반환하는 문제이다.없으면 -1을 반환한다는 전제에서 indexOf를 사용하면 쉬운 풀이가 가능하다는 것을 파악하였음
문제에선 나누기(/)를 쓰지 말라했으나, 코드가 지저분해 지는것이 싫고 납득하지 못한다면 무조건 쓰는 고집이 있는 날 꺾진 못했다.구현한다면 dividend, divisor의 음수 양수 여부를 판단하여 가능할 때까지 가감하는 방식으로 구할 수 있겠으나 귀찮음.
Map을 생성하여 단어들의 빈도를 미리 확인한다.슬라이딩 윈도우 기법을 활용하여 특정 길이만큼의 문자열을 탐색해 어떤 인덱스에서 모든 단어가 동일하게 출현되는지 확인한다.
순열의 사전식 다음 순열을 알아내는 절차와 알고리즘이 있다는 것을 알게되었음순열 요소의 우측 끝부터 왼쪽 방향으로 이동하며 첫 번째로 감소하는 원소 찾기1-1. 예: 1,3,5,4,2에서 3이 그 지점 (5 > 3). i로 지칭nums\[i] 보다 큰 가장 작은 요소
괄호의 상호작용이 일어날 때, 스텍에 현재 인덱스의 길이를 넣었다가잘못된 등호를 만났을 때, 현재 인덱스 - 기록된 마지막 인덱스 = 현재 문자열 길이를 통해 최대 등호 길이를 구하는 로직이다.
원하는 target의 index를 알아야 하는 문제이다.주어진 배열에 존재하지 않을 경우 -1을 반환해야하는 시점에 indexOf를 써도 통과가 될지 반신반의하며 제출했으나 통과됨
정렬된 nums 배열에서 target원소의 시작과 끝 인덱스를 추출하는 문제이다.너무 간단하게도 js엔 해당 메서드가 지원되고있다.
최악의 경우 시간 복잡도가 O(n)이 나오는 방식으로 해결하였다.기존 인덱스를 찾아 반환하는 요소와 달리 해당 target이 입력되어야 할 인덱스를 찾기 위해 요소를 순회하여 찾았음
스도쿠는 대각선 검사를 하지 않는다는 것을 알게되었음..서브 박스를 검사하는 로직이 굉장히 중요하다.
백트레킹을 활용해야 하는 문제이다.이전 문제 풀이와 같이 3x3 서브 박스 검증이 가능하다면 어렵지 않은 풀이가 가능하다.
해당 문제의 설명이 매우 조악하다고 생각하기에 재설명하고자 한다.n이 1일 경우 반환값은 "1"이라는 전제를 두고실제로 사람이 읽는 것처럼 n에 대한 정보가 입력되는데 예시는 아래와 같다.
DFS를 활용하여 가능한 경우의 수를 구하면 된다.다만 다른 조합 문제와는 다르게 중복 선택이 가능하므로해당 인덱스의 요소를 선택할 경우 다음 요소로 넘어가지 않고 다시 체크하는것이 중요하다.
백트레킹을 활용해야 하는 문제이다.용이한 탐색을 위해 오름차 순으로 배열을 정렬한 후 target에서 현재 인덱스의 요소를 빼며 정확히 맞아 떨어지는 순간에 조합을 정답 배열에 추가한다.중복 요소를 피하는 로직이 필요하며, 다음 백트레킹을 실행한 후 현재 조합을 빼 모
해당 배열의 값을 활용하여 인덱스 비교를 통해 없는 값을 찾아내는 방법이다.찾고자 하는 범위는 1~n까지만 조회하면 되므로 범위를 아래와 같이 잡았음
투 포인터를 활용해 쉽게 풀이가 가능한 문제이다.총 강수량을 축적해가며 물이 얼마나 고일 수 있는지 판단한다.해당 방향의 가장 높은 벽 - 현재 벽의 높이 = 쌓일 강수량위 공식을 그림을 통해 알기쉽게 표현되어있다.
문제에서 분명히 수로 변환하지 말라했는데 대부분의 풀이는 BigInt형으로 변환하여 곱셈한 후 문자열로 변환하여 제출했음..해당 풀이는 두 수의 일의자리부터 곱셈 및 올림 처리를 계산하여 정답 문자열을 구성하고 반환하는 풀이임
질문 자체가 엉망이기 때문에 이해하는데 시간이 좀 걸린 문제이다.정리해서 요약한 내용은 다음과 같다.각 배열 요소는 해당 요소에서 얼마나 먼 거리까지 점프할 수 있는지를 수로 나타내는 값이다.요소의 마지막까지 도달하는데 필요한 최소 점프 수를 반환해라※ 인덱스는 0부터
백 트레킹을 이용해 쉽게 풀이할 수 있는 문제이다.순열을 구해 결괏값으로 반환하면 됨
이전 문제와는 다르게 고유한 순열을 반환해야한다.즉 Map을 사용하여 숫자들의 출현 빈도를 파악하고 출연한 빈도 내에서만 가능한 순열을 모두 구해준 후 결과를 반환한다.해당 문제또한 백트레킹을 활용하여 모든 가능한 경우의 수를 조회한다.
이미지 회전 문제는 굉장히 간단한 문제이다.다음과 같은 공식의 적용이 필요하다대각선을 기준으로 요소를 반대편으로 옮기는 Transpose 작업 실행변경된 배열을 역순으로 재정렬하는 Reverse 작업 실행90도 회전 완료
Map 객체를 활용하여 풀이하였음문자열의 Anagram 여부를 판단하기 위해 정렬하여 키 값으로 확인했음Map 객체를 Array로 변환하기 위해 Iterator를 사용하여 변환
자바스크립트는 이미 Math.pow로 제곱 함수가 구현되어있어 복잡한 로직을 생각할 필요가 없다.문제 의도는 알겠으나, 가장 싫어하는 것은 이미 구현된 메서드를 따로 구현하는 것단, 제곱의 원리나 프로그래밍으로 구현하기 힘들 것 같다는 생각이 드는 분들은 한번 구현해봐
백트레킹의 대표적인 문제인 N-Queens 이다.행을 기준으로 각 열에 퀸을 배치하여 가능한 모든 경우의 수를 파악하고 정답 배열에 추가하였음
해당 문제는 이전 문제와 동일하게 백트레킹을 활용하여 풀이하면 된다.다만, 이 전 문제는 가능한 경우의 수를 2차원 배열로 반환해야 했던 것과 다르게현재 문제는 경우의 수를 반환해야한다.
최대 값인 Subarray의 합을 찾아내는 문제이다.구현은 매우 간단하게 가능한데, O(n)의 시간복잡도 내에서 전체 배열을 순회하며어느 타이밍에서 최대 합이 나오는지 매 요소마다 판별하면 됨
나선형 메트릭스는 대부분의 알고리즘 풀이 사이트에서도 많이 등장하는 문제이다.해결 방법은 직접 요소를 순회하며 방문했던 축을 축소하는 방식으로 풀이됨
점프 가능한 최대 거리를 갱신하며 nums 배열을 순회하면 된다.만일 특정 인덱스의 요소를 순회할 때, 현재 기록된 최대 점프 가능 거리를 초과하였다면 도착 불가능하므로 false를 반환하는 구조이다.
시작 시점을 기준으로 오름차 순 정렬한 후 순회하며현재 조회중인 지점의 종료 시간과 다음 지점의 시작 시간을 비교하여 병합 여부를 판단하면 된다.
주요 포인트는 겹치지 않는 구간에 대해 추가하고 구간이 겹치는 부분에 대한 병합 구간을 추가할 수 있느냐 이다.
마지막 단어의 길이를 알기 위해 필요한 과정은 다음과 같다.문자열의 좌우 공백 제거단어별로 분리마지막 단어의 길이 반환하여 아래와 같은 로직이 작성되었음
2차원 매트릭스에서 순차적으로 배열에 번호를 채워 출력하는 문제이다.이전에 해결했던 바와 같이 각 축의 포인터를 생성하여 직접 순회하며 번호를 채우는 방식으로 해결하였음
숫자를 생성하고 팩토리얼을 미리 계산한 후 k번째 순열이 어떤 수로 구성되어있는지 확인하는 문제이다.아마 많은 의심이 들 부분은 마지막 결괏값을 구하는 부분일텐데 간략히 설명하자면 다음과 같다.n개의 숫자로 만들 수 잇는 순열 수는 n! ex) n이 4라면, 순열은 2
미리 전체 ListNode를 순회하여 길이를 파악한 후, 꼬리가 될 지점의 이전 지점을 기점으로 k만큼 잘라 이어붙여 해결한다.
이동에 필요한 경우의 수를 계산하기 위해 첫 번째 열과 행을 1로 초기화하고, 초기화 된 셀을 기준으로 위, 왼쪽 방향의 경우의 수를 합산해 현재 셀의 경우의 수를 계산할 수 있음최종적으로 우측 하단의 셀 값을 통해 가능한 경우의 수를 알 수 있다.
이전 풀이와 대부분 동일한 방식으로 진행되며, 첫번째 행과 열을 1로 초기화 하는 것이 아닌 이전 셀들의 값으로 채워넣으므로 써 장애물이 있을 경우에 발생하는 예외를 방지할 수 있다.장애물이 없이 초기화 된 셀의 경우는 이전과 같이 좌측 셀의 경우의 수 + 상단 셀의
이전 문제들과 같이 풀이하되, 차이점은 각 셀마다의 가중치가 있다.해당 가중치를 판단하여 셀에 값을 부여할 때 어떤 경로로 지나가는 것이 최소 값인지 판단할 수 있음
정수인지를 판별하는 문제이다. 다만 테스트 케이스가 굉장히 조악하고 악명이 높기 때문에 가장 쉬운 방법으로 javascript Number 형변환을 통해 문제를 해결하였음 Infinity의 경우 javascript 내에선 number형으로 사용 가능하지만, 문제의
지문에서도 나와있듯 큰 정수에 1을 더해야 하기 때문에 BigInt 자료형을 사용해야한다.숫자배열 -> 문자열 -> BigInt -> 문자열 -> 숫자배열순으로 변환하며 계산하였음
단순히 파라미터로 입력받은 두 값을 더한 후 이진 문자열로 반환하면 되는 문제이다.다만 값이 매우 크기 때문에 parseInt를 통해서는 정상적인 변환이 불가하다javascript에선 0b문자를 이진 문자열 앞에 붙임으로써 정수가 아닌 2진수 임을 명시할 수 있다.실제
단어 사이에 공백을 균일하게 두는 것을 목표로 하는 문제이다.유의해야할 포인트는 다음과 같다.maxWidth보다 짧은 문자열을 만들되, 최대한 많은 단어가 들어갈 것공백의 수를 동일하게 만들 수 없다면, 문자열에 좌측 공백부터 우선적으로 보충할 것하나의 단어 혹은 마지
제공된 파라미터 x의 제곱근을 구하는 문제이다.내장된 함수를 사용하지 말라는 경고 때문에 Math.sqrt를 사용하지 않고 진행했음투 포인터 방식을 사용하면 최적화 하기 용이하겠지만 널널한 시간복잡도로 그냥 1부터 차근차근 확인하는 방식으로 진행하였음
DP 방식을 활용하여 풀이하면 좋은 피보나치 수열 관련 문제이다.계단을 오르는 경우의 수를 계산할 때, 계단을 오르는 보폭을 1칸 혹은 2칸으로 정의한다면 n번째 계단까지 오를 수 있는 경우의 수는 피보나치 수열의 n번째와 같다.
스택의 개념을 이해하면 쉽게 풀이가 가능한 문제이다./를 기준으로 split하게되면, 중복된 /를 효과적으로 제거할 수 있고 배열 요소를 순회하며 상위 이동과 디렉터리 이동만 판단하면 완료된다.
이 문제는 편집 거리, Levenshetein 거리로 불리는 알고리즘을 알면 매우 쉬운 풀이가 가능하다.word1의 길이를 m, word2의 길이를 n이라고 가정했을 때 (m+1) \* (n+1)크기의 2차원 배열을 생성한다.배열의 첫번째 행과 열은 0부터 m, n까지
행렬을 순회하며 0 요소가 있는 행과 열을 감지하여 저장한 후 재순회하며 해당 열이나 행의 요소가 발견되었을 때 0으로 변환하는 로직을 구성했음시간복잡도가 높기에 문제가 될거라 판단하였으나 생각과는 달리 풀어져서 놀라움
target요소가 2차원 행렬 내에 존재하는지를 확인하는 문제이다.다만 배열의 모든 요소를 순회하며 검사한다면 문제 풀이 조건에 어긋난다.따라서 이미 오름차 순으로 정렬되어있는 배열의 마지막 요소를 저장하여 target요소가 포함될 행을 파악하고 해당 행 내에서 tar
내장된 정렬 알고리즘을 사용하지 않고 색상을 빨간색 > 하얀색 > 파란색 순으로 정렬하는 문제이다.복잡한 생각할 필요 없이 요소의 수를 확인한 후 해당 요소의 수 만큼 새로 할당하는 방식을 진행하였음
슬라이딩 윈도우를 구현하여 쉽게 풀이할 수 있는 문제이다.중요 포인트는 각 윈도우 별 스펠링의 수를 대조하여 최소 길이의 윈도우를 찾아내는 것이 중요하다.처음에는 고정된 윈도우 길이를 한칸씩 이동하며 검증하는 방식을 사용했으나, 시간 초과가 발생하여 우측 포인터를 미리
조합을 구하는 로직을 작성해야하는 문제이다.백트레킹을 사용하여 조합을 구하면 된다.
백트레킹을 사용하여 풀이하는 문제이다.고정된 길이가 있지 않기 때문에 가능한 모든 경우의 수를 입력하면 된다.
현재 나온 숫자를 Map 자료구조에 담아 빈도를 정의하고 2회 이상 출연했다면 이후 부터는 원본 배열에서 제거하도록 구현하였음
배열 내에 target이 있는지 검사하는 문제이다.간단히 내장된 메서드를 통해 풀이가 가능하기에 복잡한 로직은 구현하지 않겠음
연결된 ListNode에서 중복된 요소를 모두 제거하고 이어붙이는 문제이다.포인트는 중복된 요소를 반복하여 모두 생략하고 이전 요소와 이어붙이는 로직이다.
해당 문제는, 이전 문제와 거의 동일하게 풀이하되, 중복된 요소를 삭제하는 것이 아닌 유일한 요소로 변환하여 리스트를 연결하는 문제이다.
다음과 같은 풀이 공식이 있는 문제이다.모든 막대를 순회한다.각 막대는 stack자료 형태로 보관된다.만일 i번째의 막대 높이가 stack에 저장된 마지막 높이의 막대보다 낮을 경우 다음 로직을 수행한다.3-1. 마지막 막대의 높이를 저장한다.3-2. 막대의 너비를 계
해당 문제는 이전 문제와 풀이과정이 많이 비슷한것을 알 수 있는것이, 행렬 데이터를 순회하며 히스토그램 문제로 변환하여 풀이가 가능하다.높이 데이터를 행을 순회하며 쌓아가고 그렇게 축적된 높잇값을 활용하여 히스토그램 알고리즘을 활용하여 풀이해야한다.
주석을 남겨 문제를 풀이하였음Class의 성질을 정확히 파악하느냐 못하냐를 구분할 수 있는 문제임lessTail의 next 값으로 greaterDummy.next를 주는 부분이 핵심
두 배열을 병합하는 일련의 과정을 담아낸 문제이다.쉬운 풀이가 가능하기에 추가적인 설명은 생략해도 좋을 것 같다.
grayCode를 구하는 방법을 알면 풀이가 간단한 문제이다.각 step(n)에서 이전 시퀀스에 2^(n-1)을 더해 추가하는 것이 현재 시퀀스가 되는 구조이다.
기초적인 백 트레킹 문제이다.생각할 것은 많지 않고 주어진 nums를 활용하여 중복을 허용하지 않는 Subsets를 만들면 된다.백 트레킹의 개념을 이해하고 있다면 어렵지 않게 풀 수 있음
dp의 개념을 파악하고 있다면 풀이가 어렵지 않다.문제에서 요구하는 경우의 수가 딱 두개이기 때문한자리 수가 이룰 수 있는 경우의 수두자리 수를 붙여 이룰 수 있는 경우의 수
ListNode를 제 자리에서 회전시킬 수 있냐가 관건인 문제이다.포인터 세개를 두고 다음과 같은 형식으로 Swap을 진행한다.
백트레킹 문제이다.IP 주소의 기본 구성을 잘 모른다 하더라도 친절히 적합한 IP 주소의 요건을 문제에서 제시하기에 큰 어려움 없이 풀이가 가능하다
해당 문제는 원래 재귀적으로 풀면 굉장히 간단한 문제이다.중위탐색이라는 개념을 이해하고 있다면 재귀적인 생각을 안 할 수가 없는데그렇게 되면 시간 복잡도는 문제될 것이 없지만 공간 복잡도가 굉장히 커지게 된다.따라서 문제에 제시된 대로 stack을 구현해 재귀의 개념을
주석으로 설명해두었지만, 가장 중요한 핵심은 Binary Search Tree의 특성을 잘 파악하고 있냐 이다.현재 노드를 기준으로 왼 편에는 더 작은 수가, 오른 편에는 더 큰 수가 와야 한다는 기본 개념을 안다면 동적 프로그래밍으로 쉽게 풀이가 가능하다.
해당 문제는 문제 그대로 s1과 s2를 조합하여 s3를 만들 수 있는지를 판별하는 문제이다.다만, 해당 문제를 백트레킹으로 풀이하려다 보니 Time limit이 발생하였다.따라서, dp를 통해 메모이제이션 하며 풀이하였음
BST의 기본 형식(좌측 노드는 현재 노드보다 작아야 하며 우측 노드는 현재 노드보다 커야함)을 이해하고 있으면 쉽게 풀이가 가능한 문제이다.올바른 BST인지 판별하면 끝
지문에서 언급되어 있듯 정확히 두 노드가 잘못 되었다는 표기가 있기에 풀이가 한층 더 수월하다.중위 순회로 변경 위치의 첫 노드를 잡고 부모를 기준으로 올라오며 문제가 되는 최상위 노드와 변경해주면 해결된다.
트리의 구조를 알고 있다면 풀이가 어렵지 않은 문제이다.각 트리엔 좌측, 우측 자식 노드가 있을 수도 있고 없을 수도 있다.즉 동일한 트리인지 확인하려면 자식 요소를 모두 순회하며 각각의 구조와 값을 비교하면 된다.
tree구조를 이해하고 있다면 어렵지 않게 풀이가 가능하다.좌측, 우측 노드가 있고 각 노드가 대칭인지 재귀를 통해 확인하여 풀이가 가능하다.
노드를 탐색하면 되는 문제이다.별 다른 어려움 없이 해당 노드가 있는 깊이를 파악한 후 해당 인덱스의 배열에 담아 반환하면 됨깊이 우선 탐색의 개념을 이해하면 충분히 풀이가 가능할 것 같다.
너비 우선 탐색의 개념을 활용하여 풀면 좋은 문제이다.dfs로도 풀 수 있지만 개념은 bfs에 가깝기에 해당 방법으로 풀이해보았음부모 요소를 우선적으로 살펴보며 isReverse flag를 toggle 하는 방식으로 역행 여부를 결정하였음
최대 깊이를 탐색하는 dfs를 활용하면 쉬운 풀이가 가능하다.깊이를 한 층씩 추가하며 현재까지의 깊이와 최대 깊이를 비교하는 방식으로 수행하였음
inorder와 preoder의 특성에 대해 알아야 풀이할 수 있는 문제이다.preorder는 i번째 노드가 root 노드가 될 수 있는 순서이며inorder는 i번째를 기준으로 좌측 인덱스의 노드는 좌측 노드, 우측 인덱스의 노드는 우측 노드이다.
postorder는 마지막 인덱스가 루트 인덱스임을 알면 이전 문제와 동일한 방식으로 재귀호출하여 풀이가 가능하다.
bfs를 통해 queue를 활용하여 노드를 탐색하다 자식을 unshift 메서드를 통해 배열의 앞쪽부터 채워넣어 목표하는 배열 순서를 반환하면 된다.
재귀적으로 함수를 호출하며 풀이가 가능하다. 문제에서 언급되었듯이 오름차 순으로 정렬된 배열이기 때문에 배열 중앙 요소를 루트 노드로 설정하여 재귀적으로 호출하면 된다.
linked list를 tree node로 변환하며 중요점은 가운데 값을 찾기 위해 세개의 포인터를 두고 이동해가며 중간에 존재할 루트 노드를 찾는 과정이다.
해당 문제에서 언급된 height-balanced된 tree는 높이의 차이가 2이상 나지 않는 것을 의미한다.즉 1 까지의 차이는 검증하지 않음자식 노드에서 문제된 -1은 부모 노드로 전이되며 추가 탐색하지 않게끔 구현하면 시간복잡도 줄이기에 용이하다.
해당 문제는 정말 지문 그대로 가장 가까운 leaf 노드의 depth를 반환하면 되는 문제인데, 문제 제목을 보고 무지성 dfs로 풀이하고 보니 bfs 풀이법이 훨씬 효율적이라는 점을 알게되었음..
해당 문제는, dfs를 잘 이해하고 있으면 문제 없이 풀이가 가능하다. 주요 포인트는 메인 함수를 재귀적으로 호출하여 remain 값과 leaf 노드의 값을 비교하여 풀이한다는 점
leaf node의 특성과 dfs를 알고 있다면 쉽게 풀이가 가능한 문제이다.자식 노드를 재귀적으로 탐색하며 목표치와 현재까지의 합을 비교하며 정답을 추려내면 해결됨
Binary Tree를 Linked List로 변환하는 문제이다.Linked List는 left를 갖지 않는다는 명시가 있는점을 참고해야함전위 순회를 기준으로 연결해야 하기에 leftSubTree가 우선적으로 오며 이후 leftSubTree의 끝에서 rightSubTr
백트레킹을 활용해 풀이하려 했으나 시간 초과가 발생하여 dp 풀이로 변경하였음초기화를 위해 문자열보다 1만큼 큰 배열을 만들고 첫 열은 반드시 1로 설정되게 함
BFS를 활용해 풀이해야 하는 문제이다.같은 depth의 node를 연결하면 되는 문제임
같은 depth간의 노드들을 이어줘야 하는 문제이다.같은 depth를 탐색한다는 것은 너비를 우선적으로 탐색한다는 의미이므로 bfs 풀이를 적용하였음순차적으로 다음 노드를 순회하며 탐색한다.
파스칼의 삼각형은 매우 유명한 문제이다.이전 행의 두 숫자의 합이 현재 열의 값이 되는 문제임각 열의 첫 번째와 마지막은 항상 1의 값을 갖고 있다는 점을 감안하여 열의 중앙에 위치한 값들을 순회하며 이전 행의 값을 통해 구해주면 됨
이전과 마찬가지로 파스칼 삼각형을 구축한 뒤 입력받은 row의 index를 반환하면 풀이가 가능한 문제이다.
dp를 사용하여 메모이제이션 하며 최소한의 공간으로 풀이가 가능한 문제이다.top down 방식으로 풀이하였지만, 위에서 아래로 내려가는 경우는 dfs를 사용하여 복잡하고 공간 복잡도가 늘어날 수 밖에 없는 구조라는 점을 확인했음최종적으로 bottom up 방식으로 풀
해당 문제는 배열을 순회하며 최저 금액을 갱신하고 최대 이익을 반환하면 되는 문제이다.루프를 돌며, 최저 금액을 갱신할 때는 매도할 수 없기에 건너뛰고, 아닌 경우는 현재의 이익을 갱신하며 최대 이익인지 확인한다.
이전 문제와 다르게 다양한 구간에서 매수, 매도가 가능하다.당연히 복잡하게 고민할 필요 없이조금이라도 수익이 나는 구간에서 즉시 판매하고 다시 매수하는것이 가장 효율적인 방법이다.
dp를 통해 다양한 상탯값을 설정하고, 초기화를 진행하여 문제를 풀이하였음
DFS를 통해 루트부터 서브트리를 따라가며, 계산한 합으로 나올 수 있는 최대치를 반환하는 문제이다.
펠린드롬의 비교 문제는 투 포인터를 활용하여 각 인덱스의 문자열이 같은지 비교하면 되는 문제이다.불필요한 문자를 정제하는 과정이 가장 중요하다.
가장 중요한 순서는 다음과 같다.한 글자마다 다른 알파벳으로 교체해가며 endWord까지 변경되는 과정 기록최단 경로를 찾아 반환
BFS를 활용하여 간단한 풀이가 가능하다.주요 로직은 다음과 같다.endWord가 wordList에 있는지 우선 검증 (없다면 당연히 생성 불가)단어의 각 자리를 a-z 까지 변경해보며 wordList 내에 있는 단어이며 아직 생성해보지 않았다면 queue에 추가end
Set 자료형을 활용하여 중복되는 숫자를 제거하고 순회하며 O(n)의 시간 복잡도로 처리 가능한 문제이다.풀이 프로세스는 다음과 같다.숫자의 시작점인지 확인한다. (Set내에 현재 숫자 -1 의 숫자가 있는지 확인)다음 숫자가 있을 때까지 연속되는 횟수를 카운트 하며
해당 문제는 깊이우선탐색을 진행하며 leaf node에 도달했을 때 문자열로 계산된 합계를 누적하여 풀이하는 방법으로 풀이가 가능하다.
해당 문제는 상, 하, 좌, 우가 X로 둘러쌓인 O가 X로 변환된다는 전제로 어떤 변화가 일어나야 하는지 묻는 문제이다.풀이 절차는 다음 3가지 이다.모서리의 O는 X가 될 수 없다. (모서리 이므로 4 방면이 모두 둘러쌓일 수 없음)모서리의 O와 연결된 O는 X가 될
해당 문제는 팰린드롬을 탐색해야 하는 문제이다.다만 부분 문자열의 경우 백 트레킹 방식을 사용하여 재귀적으로 탐색해야 하므로 해당 방식을 채택하였음
해당 문제는 모든 노드를 복사된 노드로 replace 해야하는 문제이다.dfs를 통해 재귀적으로 함수를 호출하며 이웃 노드들을 clone하는 방식으로 풀이하였음
해당 문제의 주요 포인트는 아래와 같다.획득 가능한 전체 가스량이 이동에 필요한 전체 비용보다 작으면 불가능 (-1 반환)N번째 주유소를 시작점으로 순회 중 가스 잔량이 충전량에 비해 부족한다면 불가능 (다음 시작점을 포인트로 변경)주유소는 재순회 할 필요가 없음. 이
해당 문제는 다음과 같은 절차로 2번 전체 순회하여 풀이가 가능하다.모든 아이에게 최소 1개씩의 사탕을 할당한다.좌측에서 우측으로 순회하며 i번째 아이가 i - 1번째 아이보다 높은 점수를 갖는 경우 i - 1번째 아이의 사탕보다 1개를 더 부여한다.우측에서 좌측으로
해시 맵 자료구조를 사용해 풀이하기 좋은 문제이다.풀이 과정의 중요 절차는 다음과 같다.key를 현재 노드로 갖고, value를 복사된 노드로 갖는 해시 맵 생성현재 노드와 복사된 노드를 추적하며 next와 random에 해당하는 클론 노드를 연결해시 맵에 저장된 클론
해당 문제를 풀이하는 과정은 다음과 같다.dp를 통해 해당 인덱스의 문자열 까지 분할이 가능한 단어인지를 판별한다.2중 반복을 통해 순회하며 이전까지의 분할 가능 여부와 현재까지의 분할 가능여부를 판단한다.최종적으로 문자열의 끝까지 분할이 가능한지 확인한다.
해당 문제를 풀고 보니 가장 효율성 있는 코드를 작성하신 분이 대단함을 느꼈음풀이 절차는 다음과 같다.backTracking 함수에서 전달받은 인자를 통해 시작점을 파악함시작점에서 1씩 증가하는 반복문을 통해 문자열을 잘라내어 해당 단어가 사전에 있는지 파악한다.bac
해당 문제는 노드를 순회하며 노드끼리 연결되어 있는지를 판별하는 문제이다.난 직관적인 풀이를 선호하기에 다음과 같은 방식으로 풀었지만 시간을 효율적으로 단축할 수 있는 좋은 풀이를 내 풀이 아래에 설명하겠음slow(head), fast(head) 노드를 생성함slow.
해당 문제는 자료형 중 Set을 사용하여 풀이하면 쉬운 문제이다.ListNode를 Set에 저장해두고, 입력 받았던 적이 있는 ListNode라면, 순회하는 Cycle이 존재한다는 의미이므로 해당 ListNode를 반환하고 없다면 null을 반환한다.
해당 문제는 다음과 같은 절차로 풀이해야 한다.slow와 fast 포인터를 두어 각각 다르게 전진하며 중간 지점을 탐색한다.이후 두 번째 절반 노드 목록을 뒤집는다(reverse)두 노드 목록을 연결한다.
별도의 풀이가 필요하지 않은 문제이다.전위 순회를 위해 깊이 우선탐색을 진행한다.탐색된 노드를 순서대로 반환하면 끝
후위 순회를 위해 재귀적인 호출을 먼저 하고 현재 노드의 값을 입력하는 방식으로 풀이가 가능한 문제이다.간단한 문제이기에 복잡한 설명이나 주석은 생략하겠음
해당 문제는 Node class를 선언하여 풀이해야 하는 문제이다.처음엔 그저 Map을 사용해서 풀이하려 했으나, 간과한 점은 조회 및 업데이트 시점에 가장 최근 캐시로 유지되는 LRU에 대한 개념이 부족했음해서 연결형 Node를 생성하여 가장 오래 조회되지 않은 노드
해당 문제는 삽입 정렬을 연결형 노드를 통해 구현하는 문제이다.풀이 과정은 다음과 같음가장 왼쪽에 위치할 노드 생성매 반복마다 1의 노드를 통해 좌측부터 현재 노드와 값을 비교해가며 이전 노드 탐색이전 노드와 현재 노드를 연결기존 현재 노드의 다음 노드를 탐색
해당 풀이는 병합 정렬을 활용한 풀이이다.풀이 절차는 다음과 같다.입력받은 연결 노드의 중간 노드를 기준으로 분리(slow, fast)재귀적으로 분리된 연결 노드를 분리merge 함수를 통해 전달된 두 노드를 정렬하며 병합
해당 문제는 점의 기울기를 구하는 공식을 알면 풀이가 간단한 문제이다.두 점의 기울기를 구하는 방법은 다음과 같다.기울기 = y2 − y1 / x2 − x1해당 공식을 바탕으로 2중 반복하며 각 좌표별 최대 위치할 수 있는 같은 기울기의 점 수를 구하면 된다.
해당 문제는 보자마자 스택형 문제임을 직감했다.해당 자료구조를 떠올렸다면 구현에 큰 어려움이 없는 문제임tokens를 순회하며 각 기호에 맞는 처리를 하면 된다.단, 주의해야 할 점은 두 번째 pop()된 선입된 요소가 나누기 작업 시 분자에 위치해야함
해당 문제는 js의 내장 메서드를 활용하여 충분한 풀이가 가능한 문제이다.풀이 절차는 다음과 같다.좌우 공백 제거공백 단위 단어 분리다중 공백 제거단어 역순 정렬공백을 통한 단어 조합
처음에 해당 문제를 슬라이딩 윈도우로 풀이하려다 시간 초과로 실패했음O(n)의 시간복잡도로 풀이하는 방식을 찾아보니 다음 풀이절차가 있음중요 포인트는 최솟값을 갱신하는 것인데, 곱하기 연산은 음수와 음수를 곱했을 때 최댓값이 나올 수 있으므로 가장 낮은 수를 알고있어야
해당 문제는 원래 투 포인터 문제이다.다음과 같은 절차로 풀이하는 것이 정석0번째 요소를 left로 정의마지막 요소를 right로 정의left가 right보다 작은 동안만 while 반복하며 중간 값을 통해 포인터를 움직여줌O(n log n)의 시간 복잡도로 풀이 가능
중복 요소가 추가되었다고 하나, 문제에서 요구하는 점은 이점과 마찬가지로 최솟값을 찾는 것이다.
이 문제에서 구현하고자 하는 MinStack은 필요할 때 요소 내 최솟값을 조회하고자 하는 커스텀 클래스이다.stack을 구현하며 min 배열을 통해 현재 최솟값을 기록할 배열을 추가함배열 요소가 push 될 때 현재 최솟값을 같이 계속 누적함. 즉 현재 요소의 인덱스
해당 문제의 풀이 과정은 다음과 같다.전제로 headA와 headB의 요소 중 최소 하나의 노드는 반드시 교차함각 root를 근원지로 한 노드들이 교차할 때까지 반복하며 요소의 끝에 도달했을 때 root로 이동함교차된 요소를 반환함
해당 문제는 간단히, 내 앞 뒤에 있는 요소가 모두 나보다 작다면 그 인덱스를 반환하면 되는 문제이다.풀이 과정은 다음과 같다.nums 배열 1회 순회 O(n)현재 요소의 앞 뒤 요소를 비교하며 하나라도 작거나 같다면 무시모두 현재 요소보다 작은 수라면 현재의 인덱스
해당 문제는 현재 요소와 다음 요소의 최대 간격을 알아내는 문제이다.풀이 과정은 다음과 같다.요소가 하나 뿐인 경우 0 반환요소 정렬순회하며 최대간격 기록 O(n)최대 간격 반환
해당 문제는 버전을 비교하여 1, -1, 0으로 반환하는 문제이다.sort()메서드에 콜백으로 주기 좋은 함수인 셈풀이 과정은 다음과 같다..을 기준으로 각 버전 분리분리된 배열 중 최대길이 만큼 반복 순회각 버전을 비교한다. 이 때 버전이 생략된 배열의 경우 0으로
해당 문제는 순환 소수를 괄호로 묶어 풀어야 하는 문제이다.소수점을 구하는 원리를 이해하고 풀면 훨씬 좋게 풀이할 수 있다.예시: 4 ÷ 333)초기 나머지: 4 % 333 = 4 → 정수 부분은 0, 나머지는 4.소수 첫째 자리:나머지 4 × 10 = 4040 ÷ 3
투 포인터를 정의하며, 왼쪽 포인터는 배열의 시작점, 오른쪽 포인터는 배열의 종료점에 위치한다.각 포인터 위치에서의 합계를 계산하여 포인터를 이동시키거나 반복문을 종료한다.각 포인터의 인덱스 위치가 아닌 실제 정수형 위치를 반환하기 위해 +1을 하여 반환한다.
나머지 값이 있는 동안 순회인덱스 계산을 위해 0-25 범위로 맞춤나머지 값을 통해 알파벳 계산몫을 계산하여 다음 계산에 활용
Map 자료형을 사용한다.숫자의 빈도를 기록한다.Iterator를 사용해 Map을 순회하며 최빈값을 조회한다.
각 자릿수의 문자는 현재 문자의 번호 \* 26(A-Z의 길이)임을 의미함순회하며 현재 문자의 번호에서 64(A 이전의 문자열 코드)를 뺌현재 자리의 누적 수 \* 26 + 현재 문자코드 번호를 누적누적된 값 반환