숫자 리스트 nums와 값 k가 주어졌을 때, 리스트에서 서로 다른 위치의 네 개 요소를 골라 그 합이 정확히 k가 되도록 할 수 있는지 확인하는 문제입니다.예를 들어 입력이 nums = [11, 4, 6, 10, 5, 1], k = 25라면, [4, 6, 10, 5]의 합이 25이므로 출력은 True가 됩니다.해결 접근 방법이 문제는 정렬과 투 포인터(Two Pointers) 기법을 활용하면 효율적으로 해결할 수 있습니다. 단계별로 살펴보면 다음과 같습니다.리스트 nums를 오름차순으로 정렬합니다.n := 리스트의 크기로 설정합니
문제 소개숫자로 이루어진 리스트 nums와 목표값 k가 주어졌을 때, 리스트 안에서 서로 다른 세 요소를 골라 그 합이 정확히 k가 되도록 할 수 있는지 확인하는 것이 이번 문제의 목표입니다.예를 들어 입력이 nums = [11, 4, 6, 10, 5, 1], k = 20이라면 결과는 True입니다. 리스트 속 [4, 6, 10] 세 숫자의 합이 정확히 20이기 때문입니다.해결 접근 방법이 문제는 리스트를 먼저 정렬한 뒤 투 포인터(two pointer) 기법을 적용하면 효율적으로 해결할 수 있습니다. 동작 순서를 단계별로 정리하면
문제 설명 숫자로 이루어진 리스트 nums와 하나의 값 target이 주어졌을 때, 인덱스가 i < j < k를 만족하면서 아래 조건을 충족하는 트리플릿(세 원소 조합)의 개수를 구하는 것이 목표입니다. nums[i] + nums[j] + nums[k] < target 예를 들어 nums = [-2, 6, 4, 3, 8], target = 12가 입력으로 주어지면 출력은 5가 됩니다. 조건을 만족하는 트리플릿은 다음과 같습니다. [-2, 6, 4] [-2, 6, 3] [-2, 4, 3] [-2, 4, 8] [-2,
숫자로 이루어진 리스트 nums와 하나의 값 k가 주어졌을 때, 리스트에서 서로 다른 세 개의 요소 (a, b, c)를 선택하여 |a + b + c − k|의 값을 최소화하고, 그 절대 차이를 반환하는 문제를 생각해 봅시다.예를 들어 입력이 nums = [2, 5, 25, 6], k = 14라고 한다면, 출력은 1이 됩니다. [2, 5, 6]을 선택하면 합이 13이 되어 14에 가장 가깝고, 절대 차이는 |13 − 14| = 1이기 때문입니다.문제 해결 접근 방법이 문제는 정렬과 투 포인터(Two Pointer) 기법을 활용하면 효
이진 트리(binary tree)가 하나 주어졌다고 가정해 봅시다. 이때 잎(리프) 노드를 제외한 모든 노드에 대해, 해당 노드의 값이 왼쪽 자식의 값과 오른쪽 자식의 값을 더한 것과 같은지 확인해야 합니다.예를 들어 입력 트리가 다음과 같다면,출력 결과는 True가 됩니다. 루트 노드 18은 왼쪽 자식 8과 오른쪽 자식 10의 합(8 + 10 = 18)과 같고, 노드 8 역시 자식인 3과 5의 합(3 + 5 = 8)과 일치하기 때문입니다.문제 해결 접근 방법이 문제는 깊이 우선 탐색(DFS)을 재귀적으로 활용하면 간단하게 해결할
문제 개요두 개의 이진 트리가 주어졌을 때, 임의의 노드에 대해 왼쪽 서브트리와 오른쪽 서브트리를 원하는 횟수만큼 자유롭게 교환할 수 있다고 가정해 보겠습니다. 이 조건에서 첫 번째 트리를 두 번째 트리와 완전히 동일한 형태로 변환할 수 있는지 판별하는 것이 이번 문제의 핵심입니다.예를 들어 아래 그림과 같은 두 트리가 입력으로 주어졌다고 합시다.루트의 자식뿐 아니라 하위 노드들의 좌우 자식까지 적절히 뒤집으면 두 트리를 같은 구조로 만들 수 있으므로, 출력 결과는 True입니다.해결 접근 방식이 문제는 레벨 순서 탐색(BFS)으로
이진 트리가 하나 주어졌을 때, 해당 트리가 대칭 트리(symmetric tree)인지 확인해야 합니다. 대칭 트리란 자기 자신의 거울상(mirror image)과 완전히 동일한 트리를 의미합니다. 예를 들어 좌우로 접었을 때 완벽하게 겹치는 나무 구조를 상상하면 이해하기 쉽습니다. 두 개의 트리를 비교했을 때 첫 번째 트리는 대칭이지만, 두 번째 트리는 대칭이 아닙니다.문제 해결 접근 방법이 문제는 재귀(Recursion)를 활용하면 간단하게 해결할 수 있습니다. 핵심 아이디어는 트리의 왼쪽 부분과 오른쪽 부분을 교차하여 비교하는
문제 개요두 개의 값 start(시작 값)와 end(목표 값)가 주어졌을 때, 아래 두 가지 연산만 사용하여 start를 end로 변환하는 데 필요한 최소 연산 횟수를 구하는 프로그램을 작성해 보겠습니다.값을 1 감소시키기값을 2배로 만들기예를 들어 start = 2, end = 7이라고 가정해 봅시다. 이때 정답은 3입니다. 2에 2를 곱해 4를 만들고, 다시 2를 곱해 8을 만든 뒤, 마지막으로 1을 빼서 7에 도달할 수 있기 때문입니다.접근 방법: 역방향 추적이 문제는 start에서 end로 순방향으로 접근하는 것보다, end
각각의 서로 다른 값이 서로 다른 작업 유형을 나타내는 tasks 리스트와 음수가 아닌 정수 k가 주어졌다고 가정해 보겠습니다. 각 작업을 완료하는 데는 1분이 걸리며, 같은 유형의 두 작업을 연속해서 수행하려면 그 사이에 반드시 k분을 기다려야 합니다. 어느 시점에서든 우리는 작업을 수행하거나 대기할 수 있습니다. 이때 모든 작업을 완료하는 데 필요한 최소 시간을 구하는 것이 문제입니다.예를 들어 입력이 nums = [2, 2, 2, 3, 3, 2], k = 1이라면 출력은 7이 됩니다. 최적의 실행 순서는 [2, 3, 2, 3,
2차원 격자(grid)로 표현된 미로가 있다고 가정해 보겠습니다. 여기서 0은 빈 공간을, 1은 벽을 의미합니다. 우리는 grid[0][0], 즉 왼쪽 상단에서 출발하여 격자의 오른쪽 하단 모서리까지 이동해야 하며, 이때 지나가야 하는 칸의 최소 개수를 구하는 것이 목표입니다. 만약 어떤 경로로도 도달할 수 없다면 -1을 반환합니다.예를 들어 다음과 같은 입력이 주어졌다고 해보겠습니다.000100100이 경우 출력은 5가 됩니다.문제 해결 접근 방법이 문제는 BFS(너비 우선 탐색)를 사용하면 효율적으로 해결할 수 있습니다. BFS
문제 개요2차원 행렬(matrix)에 다음과 같은 값들이 있다고 가정해 보겠습니다.0 : 빈 칸을 나타냅니다.1 : 벽을 나타냅니다.2 : 사람을 나타냅니다.사람은 상하좌우 네 방향(위, 아래, 왼쪽, 오른쪽)으로 자유롭게 이동할 수 있습니다. 우리가 구해야 할 것은 벽이 아닌 칸 중에서 모든 사람이 그 칸까지 걸어가는 총 이동 거리의 합을 최소화하는 위치이며, 마지막으로 그 최소 거리 값을 반환하는 것입니다.예를 들어 입력이 다음과 같다면,201010120022출력은 7이 됩니다. 최적의 만남 지점은 행렬의 오른쪽 아래 모서리이기
값을 가진 이진 트리(binary tree)가 주어졌을 때, 트리에 포함된 모든 노드 값의 합계를 구해야 하는 경우가 있습니다.예를 들어 다음과 같은 트리가 입력으로 주어지면출력 결과는 14가 됩니다. 즉, 2 + 4 + 3 + 5 = 14입니다.문제 해결 접근 방법이 문제는 재귀(Recursion)를 활용하면 간단하게 해결할 수 있습니다. 트리 순회는 본질적으로 재귀적인 구조를 가지기 때문입니다. 해결 단계는 다음과 같습니다.노드(node)를 인자로 받는 recurse() 함수를 정의합니다.val 변수에 현재 노드의 값을 저장합니
문제 소개이진 트리와 "R"(오른쪽), "L"(왼쪽), "U"(위)로 구성된 문자열 목록 moves가 주어졌다고 가정해 보겠습니다. 루트 노드에서 시작하여 moves의 각 이동 명령을 순서대로 수행하며 트리를 탐색해야 합니다. 각 명령의 의미는 다음과 같습니다."R": 오른쪽 자식 노드로 이동"L": 왼쪽 자식 노드로 이동"U": 부모 노드로 이동예를 들어, 아래와 같은 이진 트리가 있고 입력이 ["R", &
문자열 s가 주어졌을 때, s의 왼쪽과 오른쪽 끝을 잘라내어(트리밍하여) 회문을 만들 수 있는 방법의 총개수를 구하는 문제입니다.예를 들어 입력이 s = momo라면 출력은 6이 됩니다. 좌우를 다양하게 잘라내면 m, o, mom, m, omo, o처럼 여섯 가지 회문을 얻을 수 있기 때문입니다.접근 방법: 중심 확장(Center Expansion)이 문제는 사실 문자열 안에 존재하는 회문 부분 문자열(palindromic substring)의 개수 세기와 같습니다. 어떤 방식으로 좌우를 잘라내더라도 결과물은 항상 s의 연속된 부분
두 개의 이진 트리(binary tree)가 주어졌을 때, 두 트리가 구조와 값 모든 면에서 완전히 동일한지 확인해야 하는 경우가 있습니다. 이렇게 서로 똑같은 트리를 흔히 쌍둥이 트리(twin trees)라고 부릅니다.예를 들어 아래와 같은 트리 쌍이 입력으로 주어진다면, 첫 번째 쌍은 구조와 값이 모두 일치하므로 True가 출력됩니다. 반면 두 번째 쌍은 노드의 값이 다르고, 세 번째 쌍은 트리의 구조 자체가 달라서 각각 False가 출력됩니다.문제 해결 접근 방식이 문제는 재귀(recursion)를 활용하면 깔끔하게 해결할 수
문제 설명 숫자로 이루어진 리스트 nums와 정수 k가 주어졌다고 가정해 보겠습니다. 이때 합이 k가 되는 서로 겹치지 않는(non-overlapping) 두 개의 부분 리스트를 찾아 그 길이의 합을 구해야 합니다. 가능한 조합이 여러 개라면 가장 짧은 두 부분 리스트를 선택해야 하며, 조건을 만족하는 답이 없다면 -1을 반환합니다. 예를 들어 입력이 nums = [7, 10, -2, -1, 4, 3], k = 7이라면 출력은 3이 됩니다. [7]과 [4, 3]을 선택하면 되는데, [10, -2, -1] 역시 합이 7이지만 길이가
각 행이 [start_x, end_x, num_passengers] 형태로 구성된 requested_trips라는 행렬이 있다고 가정해 보겠습니다. 각 요청된 여행은 start_x 위치에서 num_passengers명의 승객을 태워 end_x 위치에서 내려주는 것을 의미합니다. 또한 주어진 용량(capacity)만큼 승객을 수용할 수 있는 차량이 있으며, 이 차량은 x = 0 위치에서 출발합니다. 차량은 오른쪽 방향으로만 이동할 수 있으며, 우리는 모든 승객을 태우고 내려주어야 합니다. 이때 모든 승객을 성공적으로 태우고 내릴 수
문제 개요양수 또는 음수로 이루어진 숫자 리스트 nums가 주어졌을 때, 배열에 포함된 모든 값의 등장 횟수가 서로 고유한지 확인하는 프로그램을 작성해야 합니다.예시입력이 다음과 같다고 가정해 보겠습니다.nums = [6, 4, 2, 9, 4, 2, 2, 9, 9, 9]이 경우 각 숫자의 등장 횟수는 다음과 같습니다.6 → 1회4 → 2회2 → 3회9 → 4회모든 등장 횟수(1, 2, 3, 4)가 서로 중복되지 않으므로, 결과는 True입니다.해결 접근 방식이 문제는 다음 단계를 통해 해결할 수 있습니다.1단계: num_counts
이진 트리(binary tree)가 주어졌을 때, 트리 내 모든 노드의 값이 서로 동일한지 확인해야 하는 문제를 생각해 볼 수 있습니다.예를 들어, 다음과 같은 입력이 주어진다면모든 노드가 같은 값을 가지므로 출력 결과는 True가 됩니다.문제 해결 접근 방식이 문제는 재귀(Recursion)를 활용하면 간단하게 해결할 수 있습니다. 해결 과정은 다음과 같습니다.solve() 함수를 정의합니다. 이 함수는 루트 노드(root)와 비교 기준 값(val)을 매개변수로 받습니다.루트 노드가 null인 경우에는 True를 반환합니다. 빈
값 n이 주어졌다고 가정해 보겠습니다. 이때 우리는 길이가 n인 모든 거꾸로 된 숫자(upside down number)를 찾아야 합니다. 거꾸로 된 숫자란 숫자를 180도 회전했을 때 원래 모양과 동일하게 보이는 수를 의미합니다. 예를 들어 입력이 n = 2라면 출력은 [11, 69, 88, 96]이 됩니다. 거꾸로 된 숫자의 조건 180도 회전했을 때 유효한 숫자로 유지되는 숫자는 0, 1, 6, 8, 9뿐입니다. 각 숫자는 회전 시 다음과 같이 대응됩니다. 0 → 0 1 → 1 6 → 9 8 → 8 9 → 6 반면 2,