0은 물(water), 1은 땅(land)을 나타내는 이진 행렬(binary matrix)이 주어졌다고 가정해 보겠습니다. 이때 물로부터 맨해튼 거리(Manhattan distance)가 가장 먼 땅을 찾고, 그 거리 값을 반환하는 것이 이 문제의 목표입니다.문제 예시예를 들어 다음과 같은 행렬이 입력으로 주어진 경우를 살펴보겠습니다.1111110111110011이 경우 출력 결과는 3입니다. [0, 0] 위치의 셀이 물로부터 맨해튼 거리 3만큼 떨어져 있기 때문입니다.해결 접근 방법이 문제는 BFS(너비 우선 탐색)를 활용하면 효
문제 소개 빨강(R), 초록(G), 파랑(B) 세 가지 색상으로 이루어진 리스트가 있다고 가정해 보겠습니다. 리스트 안에서 서로 다른 두 색상이 나란히 인접해 있다면, 이 두 아이템을 합쳐서 나머지 세 번째 색상의 아이템 하나로 바꿀 수 있습니다. 우리가 구해야 하는 것은 이러한 변환을 임의의 순서로 반복 수행했을 때, 마지막에 남길 수 있는 아이템의 최소 개수입니다. 예를 들어 입력이 colors = [G, R, G, B, R]라고 한다면, 아래 그림과 같은 과정을 거쳐 아이템 하나만 남길 수 있으므로 결과는 1이 됩니다. 문
문제 소개강을 건너기 위해 밟고 지나갈 수 있는 돌들의 위치가 정렬된 리스트 형태로 주어진다고 가정해 봅시다. 강을 건너려면 반드시 마지막 돌에 도착해야 하며, 매 단계마다 직전 점프 거리를 k라고 할 때 k-1, k, k+1 중 하나의 거리만큼 앞으로 점프할 수 있습니다. 우리가 확인해야 할 것은 이러한 규칙 안에서 강을 끝까지 건널 수 있는지 여부입니다.예를 들어 stones = [0, 1, 3, 4, 5, 6, 8, 9, 13]이 입력으로 주어지면 결과는 True입니다. 0에서 출발해 1만큼 점프하여 돌 1로 이동하고, 다시
문제 개요이진 문자열이 주어졌을 때, 임의의 두 비트를 서로 교환(swap)할 수 있다고 가정해 봅시다. 이때 문자열 안의 모든 1을 연속된 하나의 그룹으로 모으기 위해 필요한 최소 스왑 횟수를 구하는 것이 목표입니다.예를 들어 입력이 s = 0111001이라면, 출력은 1이 됩니다. 다음과 같은 스왑 한 번만 수행하면 되기 때문입니다.0111001 -> 1111000접근 방법: 슬라이딩 윈도우와 누적 합이 문제는 슬라이딩 윈도우(Sliding Window) 기법과 누적 합(Prefix Sum) 배열을 활용하면 효율적으로 해결
문제 개요 길이가 같은 두 개의 숫자 리스트 nums0과 nums1, 그리고 거리를 의미하는 d와 비용을 의미하는 c가 주어집니다. 우리는 nums0 또는 nums1 중 한쪽의 인덱스 0에서 출발하여, 어느 한쪽 리스트의 마지막 인덱스에 도달해야 합니다. 매 단계마다 비용 c를 지불하면 다른 리스트로 전환할 수 있고, 그 후에는 최대 d만큼 앞으로 점프할 수 있습니다. 이때 특정 인덱스에 착지하면 해당 위치의 값을 비용으로 지불해야 합니다. 목표는 작업을 완료하는 데 드는 최소 총비용을 구하는 것입니다. 입력 및 출력 예시 예를 들
문제 이해하기숫자로 이루어진 리스트 nums와 정수 k가 주어졌을 때, 길이가 정확히 k이면서 엄격하게(strictly) 증가하는 부분 수열의 개수를 구하는 프로그램을 작성해 보겠습니다.여기서 엄격하게 증가한다는 것은 부분 수열 내에서 앞의 원소가 항상 뒤의 원소보다 작아야 한다는 의미입니다. 만약 정답이 매우 커질 수 있다면, 결과를 10^9 + 7로 나눈 나머지를 반환해야 합니다.예를 들어 입력이 다음과 같다고 가정해 봅시다.nums = [2, 3, 4, 1]k = 2이 경우 길이가 2인 증가 부분 수열은 [2, 3], [3,
각 구간(interval)이 [시작 시간, 종료 시간, 수익]의 세 가지 값을 담고 있는 목록이 있다고 가정해 봅시다. 동시에는 한 번에 하나의 작업만 수행할 수 있으며, 우리는 이 조건에서 얻을 수 있는 최대 수익을 찾아야 합니다.예를 들어 입력이 intervals = [[1, 2, 100],[3, 5, 40],[6, 19, 150],[2, 100, 250]]라면 출력은 350이 됩니다. 서로 겹치지 않는 두 구간 [1, 2, 100]과 [2, 100, 250]을 선택하면 수익 100 + 250 = 350을 얻을 수 있기 때문입니
문제 설명 숫자로 이루어진 리스트 nums와 정수 k가 주어졌을 때, 길이가 k인 부분 수열(subsequence) 중 사전순(lexicographically)으로 가장 작은 것을 찾아야 합니다. 예를 들어 nums = [2, 3, 1, 10, 3, 4], k = 3이 입력으로 주어지면 출력은 [1, 3, 4]가 됩니다. 해결 접근 방법 이 문제는 그리디(greedy) 방식으로 해결할 수 있습니다. 핵심 아이디어는 다음과 같습니다. 결과 수열의 각 자리에 올 값을 왼쪽부터 차례대로 결정합니다. 결과의 j번째 원소는 이전에 선택
문제 소개숫자로 이루어진 리스트 nums와 정수 k가 주어졌을 때, 정확히 k개의 서로 다른(고유한) 숫자를 포함하는 연속된 부분 리스트(sublist)의 개수를 구해야 합니다.예를 들어 nums = [2, 2, 3, 4], k = 2라고 한다면, 조건을 만족하는 부분 리스트는 [2, 2, 3], [2, 3], [3, 4]로 총 3개이므로 출력 결과는 3이 됩니다.접근 방법: 슬라이딩 윈도우이 문제는 슬라이딩 윈도우(sliding window) 기법으로 효율적으로 해결할 수 있습니다. 핵심 아이디어는 정확히 k개인 경우를 직접 세는
N×M 크기의 이진 행렬(binary matrix)이 주어졌다고 가정해 보겠습니다. 여기서 0은 빈 칸을, 1은 막힌 칸(장애물)을 의미합니다. 행렬의 왼쪽 위 모서리에서 출발하여 오른쪽 아래 모서리에 도달할 수 있는 경로의 수를 구하는 것이 목표입니다. 단, 이동은 오른쪽 또는 아래 방향으로만 가능하며, 답이 매우 커질 수 있으므로 10^9 + 7로 나눈 나머지를 반환해야 합니다.예를 들어 입력이 다음과 같다면001000110출력은 2가 됩니다. 오른쪽 아래에 도달할 수 있는 두 가지 경로는 [오른쪽, 아래, 오른쪽, 아래]와 [
문제 개요하나의 이진 트리가 주어졌을 때, 그 안에서 노드 수가 가장 많은 하위 트리 중 이진 탐색 트리(Binary Search Tree, BST)의 조건을 만족하는 것을 찾아야 합니다.예를 들어 다음과 같은 입력 트리가 있다고 가정해 보겠습니다.이 경우 출력 결과는 다음과 같습니다.해결 접근 방법이 문제는 후위 순회(post-order traversal)를 활용해 해결할 수 있습니다. 각 노드에 대해 왼쪽과 오른쪽 서브트리의 값을 모두 수집한 뒤, 해당 목록이 정렬되어 있는지 확인하면 그 하위 트리가 BST인지 판별할 수 있습니
숫자로 이루어진 리스트 nums와 정수 k가 주어졌다고 가정해 보겠습니다. 이 문제의 목표는 리스트에서 길이가 k인 서로 겹치지 않는 세 개의 부분 리스트를 선택했을 때 얻을 수 있는 최대 합을 구하는 것입니다. 예를 들어 입력이 nums = [2, 2, 2, -6, 4, 4, 4, -8, 3, 3, 3], k = 3이라면 출력은 27이 됩니다. [2, 2, 2], [4, 4, 4], [3, 3, 3] 세 개의 부분 리스트를 선택하면 합이 6 + 12 + 9 = 27로 최대가 되기 때문입니다. 해결 접근 방법 이 문제는 단순히 모든
숫자로 이루어진 리스트 nums와 값 k가 주어졌을 때, 이 리스트를 각 하위 리스트의 길이가 k 이상이면서 원소가 엄격하게 증가하는 여러 하위 리스트로 나눌 수 있는지 판별해야 합니다. 단, 하위 리스트가 반드시 연속된 구간일 필요는 없습니다. 예를 들어 입력이 nums = [6, 7, 5, 10, 13], k = 2라면 결과는 True입니다. 리스트를 [5, 6]과 [7, 10, 13]으로 나누면 두 하위 리스트 모두 길이가 2 이상이면서 엄격하게 증가하기 때문입니다. 접근 방법 이 문제는 다음 단계를 따라 해결할 수 있습니다
문제 개요 비내림차순(오름차순)으로 정렬된 숫자 리스트 nums가 주어졌을 때, 이 리스트를 여러 개의 부분 수열로 분할할 수 있는지 확인하는 프로그램을 만들어 보겠습니다. 이때 각 부분 수열은 다음 조건을 만족해야 합니다. 각 부분 수열의 길이는 최소 3 이상이어야 합니다. 각 부분 수열은 1씩 연속적으로 증가하는 숫자(예: 4, 5, 6, 7)로 구성되어야 합니다. 예를 들어 입력이 nums = [2, 3, 4, 4, 5, 6, 7]이라면 결과는 True입니다. 이 리스트는 [2, 3, 4]와 [4, 5, 6, 7] 두 개의
숫자로 이루어진 리스트 nums가 주어졌을 때, 인접한 두 숫자의 차이가 양수와 음수를 번갈아 가며 나타나는 가장 긴 부분 수열(subsequence)의 길이를 찾는 문제를 살펴보겠습니다. 단, 첫 번째 차이는 양수여도 되고 음수여도 됩니다. 문제 이해하기 예를 들어 입력이 nums = [6, 10, 4, 2, 3, 9, 4, 7]이라면 정답은 6입니다. 그 이유는 [6, 10, 2, 9, 4, 7]이라는 부분 수열을 선택할 수 있고, 이때의 차이 값들이 [4, -8, 7, -5, 3]처럼 양수와 음수가 번갈아 나타나기 때문입니다.
숫자로 이루어진 리스트 nums가 있다고 가정해 보겠습니다. 이때 우리가 구해야 하는 것은 이 리스트에서 만들 수 있는 가장 긴 산술(등차) 부분 시퀀스의 길이입니다.여기서 산술 수열이란 인접한 두 원소의 차이가 항상 일정한 수열을 의미합니다. 즉, 수열 S에 대해 모든 i(0 ≤ i < S의 길이 - 1)에 대해 S[i+1] - S[i]의 값이 동일하다면 그 수열은 산술 수열입니다.예를 들어 입력이 nums = [1, 4, 7, 10, 13, 20, 16]이라면 출력은 6이 됩니다. 부분 시퀀스 [1, 4, 7, 10, 13
세 개의 문자열 s1, s2, s3가 주어졌을 때, 세 문자열 모두에 공통으로 나타나는 가장 긴 공통 부분 수열(Longest Common Subsequence, LCS)의 길이를 구하는 프로그램을 만들어 보겠습니다.예를 들어 입력이 s1 = ababchemxde, s2 = pyakcimde, s3 = oauctime이라면, 세 문자열에 공통으로 등장하는 가장 긴 부분 수열은 acme이므로 결과는 4가 됩니다.해결 접근 방식이 문제는 동적 계획법(Dynamic Programming)을 사용하면 효율적으로 해결할 수 있습니다. 흔히
문제 소개 하나의 이진 트리(binary tree)가 주어졌을 때, 경로에 포함된 노드 값들의 합이 짝수가 되는 경로 중 가장 긴 것의 길이를 구하는 문제입니다. 예를 들어 루트가 2이고, 왼쪽 자식이 5, 오른쪽 자식이 4이며, 4의 왼쪽 자식은 8, 오른쪽 자식은 2, 그리고 8의 왼쪽 자식이 5인 트리가 주어졌다고 해보겠습니다. 이때 경로 [5, 2, 4, 8, 5]의 합은 24(짝수)이므로 정답은 5가 됩니다. 해결 전략: 깊이 우선 탐색(DFS) 이 문제는 DFS(깊이 우선 탐색)를 활용하면 효율적으로 해결할 수 있습니다
문제 소개2차원 행렬이 주어졌을 때, 그 안에서 찾을 수 있는 가장 긴 엄격하게 증가하는 경로(strictly increasing path)의 길이를 구하는 것이 목표입니다. 경로를 따라 이동할 때는 위, 아래, 왼쪽, 오른쪽 네 방향으로만 움직일 수 있으며, 대각선 이동은 허용되지 않습니다.예를 들어 다음과 같은 행렬이 입력으로 주어진다고 가정해 보겠습니다.246157339이 경우 정답은 6입니다. 가장 긴 경로가 [1, 2, 4, 6, 7, 9]이기 때문입니다.풀이 접근 방식이 문제는 깊이 우선 탐색(DFS)을 활용한 동적 계획
이번 문제는 소문자로 이루어진 문자열 s가 주어졌을 때, 해당 문자열 안에서 만들 수 있는 가장 긴 회문(palindrome) 부분 수열의 길이를 구하는 것입니다.여기서 부분 수열(subsequence)은 문자열에서 일부 문자를 삭제하더라도 나머지 문자들의 상대적인 순서가 유지되는 형태를 의미합니다. 반드시 연속된 문자일 필요는 없다는 점이 부분 문자열(substring)과 다릅니다.예를 들어 입력이 s = aolpeuvekyl이라면, 정답은 5가 됩니다. 이 문자열에서 level이라는 회문을 만들 수 있기 때문입니다.해결 접근 방