문제 개요 오른쪽에 위치한 모든 노드가 형제 노드를 가진 리프 노드이거나 비어 있는 이진 트리가 있다고 가정해 보겠습니다. 이 트리를 상하로 뒤집어, 원래의 오른쪽 노드들이 왼쪽 리프 노드로 변환된 새로운 트리를 만들어야 하며, 최종적으로는 변환된 트리의 새 루트 노드를 반환하면 됩니다. 예를 들어 입력 트리가 [1,2,3,4,5]와 같다면 다음과 같습니다. 이때 출력으로 반환되는 이진 트리의 루트는 [4,5,2,#,#,3,1]입니다. 해결 접근 방법 이 문제는 재귀적 순회를 활용해 해결할 수 있으며, 다음 단계를 따릅니다.
문제 개요문자열 s가 주어졌을 때, 서로 다른 문자가 최대 2개만 포함된 가장 긴 부분 문자열(substring) t의 길이를 구하는 것이 이번 문제의 목표입니다.예를 들어 입력이 eceba라면, 정답은 3입니다. 이때 가장 긴 부분 문자열 t는 ece로, 길이가 3이며 e와 c 두 종류의 문자만 사용합니다.해결 접근 방식: 슬라이딩 윈도우 + 해시 맵이 문제는 슬라이딩 윈도우(Sliding Window) 기법과 해시 맵(Hash Map)을 조합하면 O(n) 시간 복잡도로 효율적으로 해결할 수 있습니다. 핵심 아이디어는 다음과 같습
두 개의 문자열 s와 t가 주어졌을 때, 두 문자열이 한 번의 편집 거리(One Edit Distance)만큼 차이가 나는지 판별하는 문제를 살펴보겠습니다.편집 거리의 세 가지 유형문자열 s에 문자 하나를 삽입하여 t를 만든다문자열 s에서 문자 하나를 삭제하여 t를 만든다문자열 s의 문자 하나를 교체하여 t를 만든다예를 들어 입력이 s = ab, t = acb라면, s에 c를 삽입하면 t가 되므로 출력은 True(참)입니다.해결 접근 방법이 문제는 다음 단계를 따라 해결할 수 있습니다.n := s의 길이, m := t의 길이로 설정
문제 소개 정렬된 정수 배열 nums가 주어졌다고 가정해 봅시다. 배열 원소들의 값은 닫힌 구간 [lower, upper] 안에 속하며, 우리는 이 범위 안에서 배열에 빠져 있는 숫자 구간, 즉 누락된 범위(missing ranges)를 모두 찾아야 합니다. 예를 들어 입력이 nums = [0, 1, 3, 50, 75]이고 lower = 0, upper = 99라면 출력은 다음과 같습니다. [2, 4->49, 51->74, 76->99] 배열에 없는 값이 하나뿐이면 2처럼 단일 값으로 표현되고, 4~49, 51~74
입력으로 주어진 문자열(문자 배열)을 받아, 각 단어 내부의 글자 순서는 그대로 유지하면서 단어와 단어의 위치만 서로 뒤바꾸는 문제입니다.예를 들어 입력이 [t,h,e, ,m,a,n, ,i,s, ,n,i,c,e]라면, 출력은 [n,i,c,e, ,i,s, ,m,a,n, ,t,h,e]가 됩니다. 즉, the man is nice라는 문장이 nice is man the로 변환됩니다.해결 접근 방법이 문제는 두 단계 반전(two-pass reversal) 기법으로 효율적으로 해결할 수 있습니다. 알고리즘은 다음과 같습니다.배열 s 전체를
생성자에서 단어 목록을 전달받아 저장하는 클래스가 있다고 가정해 봅시다. 이 클래스에는 두 단어 word1과 word2를 매개변수로 받아, 리스트 안에서 이 두 단어 사이의 최단 거리를 찾는 메서드가 있습니다. 핵심은 이 메서드가 서로 다른 인자 조합으로 수없이 반복 호출될 수 있다는 점이며, 따라서 호출 시마다 빠르게 결과를 반환하도록 설계해야 합니다.예를 들어 words = [practice, makes, perfect, skill, makes]라고 가정해 보겠습니다. 이때 입력이 word1 = skill, word2 = pra
최단 단어 거리 III(Shortest Word Distance III)는 단어 배열에서 두 단어 사이의 최단 거리를 구하는 대표적인 알고리즘 문제입니다. 기본 버전과 달리 이 문제에서는 두 단어가 동일한 문자열일 수 있다는 조건이 추가되어, 같은 단어의 인접한 등장 위치 사이 거리까지 계산해야 하는 점이 핵심 난관입니다. 문제 설명 단어 목록 words와 두 단어 word1, word2가 주어졌을 때, 목록에서 이 두 단어 사이의 최단 거리를 찾아야 합니다. word1과 word2는 서로 같은 단어일 수도 있으며, 이 경우 배열
문제 소개이번 문제는 길이가 n인 모든 스트로보그램 숫자(strobogrammatic number)를 찾는 것입니다. 스트로보그램 숫자란 숫자를 180도 회전했을 때 원래 모양과 똑같이 보이는 수를 의미합니다.예를 들어 입력이 n = 2라면 출력은 ["11", "69", "88", "96"]이 됩니다. 11과 88은 회전해도 그대로이며, 69는 회전하면 96처럼 보이지만 좌우가 뒤집힌 형태로 동일하게 인식됩니다.회전 가능한 숫자 조합모든 숫자가 회전 후에도 유효
문자열이 하나 있다고 가정해 보겠습니다. 각 문자를 알파벳 순서상 바로 다음 문자로 시프트할 수 있으므로, 예를 들어 abc는 bcd로 바꿀 수 있습니다. 이 연산을 반복하면 abc → bcd → ... → xyz처럼 이어지는 수열이 만들어집니다. 이제 소문자 알파벳으로만 구성된 비어 있지 않은 문자열 목록이 주어졌을 때, 같은 시프트 수열에 속하는 문자열들을 모두 그룹으로 묶어야 합니다.예를 들어 입력이 [abc, bcd, acef, xyz, az, ba, a, z]라면 출력은 [[abc, bcd, xyz], [az, ba], [
문제 개요하나의 이진 트리가 주어졌을 때, 유니밸류 서브트리(uni-value subtree)의 개수를 세는 것이 이번 문제의 목표입니다. 여기서 유니밸류 서브트리란 해당 서브트리에 속한 모든 노드의 값이 동일한 서브트리를 의미합니다.예를 들어 트리가 다음과 같이 주어진 경우를 살펴보겠습니다.root = [5,1,5,5,5,null,5]위 트리에서 값이 모두 같은 서브트리는 총 4개이므로, 출력 결과는 4가 됩니다.해결 접근 방법이 문제는 재귀적 후위 순회(post-order traversal)를 이용하면 깔끔하게 해결할 수 있습니
2차원 벡터가 주어졌을 때, 이를 1차원처럼 순회할 수 있는 반복자(Iterator)를 설계하고 구현해야 합니다. 이 문제는 흔히 2D 벡터 평탄화라고 불리며, 다음과 같은 두 가지 핵심 메서드를 제공해야 합니다.next() — 현재 위치의 다음 요소를 반환합니다.hasNext() — 다음에 반환할 요소가 존재하는지 여부를 확인합니다.동작 예시입력이 [[1,2],[3],[4]]와 같이 주어지고, 아래 순서대로 메서드를 호출한다고 가정해 보겠습니다.iterator.next(); iterator.next(); iterator.next(
문제 개요회의 시간 구간 배열이 주어졌을 때, 필요한 최소 회의실 개수를 구하는 문제입니다. 각 구간은 시작 시간과 종료 시간의 쌍 [[s1,e1],[s2,e2],...] 형태로 표현되며, 모든 쌍은 si < ei 조건을 만족합니다.예를 들어 입력이 [[0, 30], [5, 10], [15, 20]]이라면 출력은 2가 됩니다. 첫 번째 회의(0~30)가 진행되는 동안 두 번째 회의(5~10)가 겹치므로 회의실이 하나 더 필요하고, 세 번째 회의(15~20)는 두 번째 회의가 끝난 뒤 같은 회의실에서 진행할 수 있기 때문입니다.
어떤 수를 생각해 봅시다. 하나의 수는 여러 인수(약수)들의 곱으로 표현할 수 있습니다. 예를 들어 8은 2 × 2 × 2로도, 2 × 4로도 표현할 수 있습니다. 이번 문제는 정수 n을 입력받아, n을 두 개 이상의 인수로 분해할 수 있는 모든 조합을 반환하는 함수를 만드는 것입니다.예를 들어 입력이 12라면, 출력은 [[2, 6], [2, 2, 3], [3, 4]]가 됩니다.접근 방법이 문제는 재귀 호출과 백트래킹(backtracking) 기법으로 해결할 수 있습니다. 핵심 아이디어는 n을 가장 작은 인수부터 차례대로 나누면서,
문제 개요숫자로 이루어진 수열이 하나 주어졌을 때, 이 수열이 어떤 이진 탐색 트리(Binary Search Tree, BST)의 올바른 전위 순회(preorder traversal) 결과인지 판별하는 문제입니다. 수열에 포함된 각 숫자는 모두 고유하다고 가정할 수 있습니다.예를 들어 다음과 같은 이진 탐색 트리가 있다고 가정해 보겠습니다.이 트리를 전위 순회하면 [5, 2, 1, 3, 6]이 되므로, 입력이 [5, 2, 1, 3, 6]일 때의 출력은 true입니다.접근 방법전위 순회의 핵심 성질을 활용합니다. 전위 순회는 루트 →
문제 설명n개의 정수로 이루어진 배열 nums와 목표값 target이 주어졌을 때, 조건 nums[i] + nums[j] + nums[k] < target을 만족하는 인덱스 삼중쌍 (i, j, k)의 개수를 구하는 것이 이번 문제의 목표입니다. 여기서 i, j, k는 모두 0부터 n-1 사이의 범위에 속합니다.예를 들어 입력이 nums = [-2, 0, 1, 3]이고 target = 2라면 출력은 2가 됩니다. 합이 2보다 작은 삼중쌍이 [-2, 0, 1]과 [-2, 0, 3] 두 개뿐이기 때문입니다.접근 방법: 정렬 + 투
문제 개요0부터 n-1까지 번호가 매겨진 n개의 노드와 무방향 간선 목록 [u, v]가 주어졌을 때, 이 간선들이 하나의 유효한 트리(valid tree)를 이루는지 확인하는 함수를 작성해야 합니다.예를 들어 n = 5이고 edges = [[0,1], [0,2], [0,3], [1,4]]라면, 모든 노드가 연결되어 있고 사이클이 없으므로 출력은 true입니다.유효한 트리의 조건은 다음 두 가지입니다.① 그래프에 사이클이 존재하지 않아야 합니다.② 모든 노드가 하나의 연결 요소(connected component)에 속해 있어야 합니
문제 개요문자열 s가 주어졌을 때, 이 문자열의 문자들을 재배열하여 만들 수 있는 모든 회문(팰린드롬) 순열을 중복 없이 찾는 것이 이번 문제의 목표입니다. 만약 회문 순열이 하나도 존재하지 않는다면 빈 결과를 반환하면 됩니다.예를 들어 입력이 aabb라면, 만들 수 있는 회문 순열은 [abba, baab] 두 가지입니다.접근 방법이 문제는 백트래킹(backtracking) 기법으로 효율적으로 해결할 수 있습니다. 핵심 아이디어는 다음과 같습니다.각 문자가 몇 번 등장하는지 개수를 먼저 셉니다.회문이 되려면 홀수 개로 등장하는 문자
여러 개의 문자열로 이루어진 리스트가 있다고 가정해 봅시다. 우리는 이 문자열 리스트를 하나의 문자열로 변환하는 인코더(encode)와, 인코딩된 문자열을 다시 원래의 리스트로 복원하는 디코더(decode)를 설계해야 합니다.서로 다른 두 대의 머신에 각각 다음과 같은 함수가 설치되어 있다고 생각하면 이해하기 쉽습니다.머신 1 (송신자)의 함수string encode(vector<string> strs) { // 문자열들을 읽어 인코딩된 문자열(encoded_string)을 반환하는 코드; }머신 2 (수신자)의
유명인(Celebrity) 문제란? n명의 사람(0부터 n-1까지 번호가 매겨짐)이 있고, 그중 한 명의 유명인이 존재할 수 있다고 가정해 봅시다. 어떤 사람 x가 나머지 모든 n-1명에게 알려져 있으면서, 정작 x 자신은 그들 중 아무도 알지 못한다면 x를 유명인이라고 정의합니다. 우리가 해야 할 일은 이런 유명인이 실제로 누구인지 찾아내거나, 유명인이 존재하지 않는다는 사실을 확인하는 것입니다. 정보를 얻을 수 있는 방법은 오직 하나뿐입니다. 특정 사람 A에게 B를 아십니까?라고 물어 A가 B를 아는지 여부만 확인할 수 있습니
문제 개요정렬되지 않은 배열 nums가 주어졌을 때, 이를 제자리(in-place)에서 재배열하여 nums[0] <= nums[1] >= nums[2] <= nums[3] ... 과 같은 지그재그(위글) 패턴을 만들어야 합니다.예를 들어 입력이 nums = [3,5,2,1,6,4]라면 결과는 [3,5,1,6,2,4]가 됩니다. 물론 조건만 만족한다면 다른 순서의 답도 허용됩니다.해결 전략이 문제는 배열을 한 번만 순회하면서 인접한 두 원소의 대소 관계를 확인하는 방식으로 간단히 해결할 수 있습니다. 알고리즘의 진행