문제 소개 숫자로 이루어진 리스트 nums가 주어졌을 때, 다음과 같은 연산을 사용할 수 있다고 가정해 봅시다. 리스트의 첫 번째 또는 마지막 요소가 아닌 숫자 하나를 선택해 제거하고, 그 숫자와 양옆에 인접한 두 숫자의 합만큼 점수를 얻습니다. 이 연산은 원하는 만큼 반복할 수 있으며, 우리의 목표는 얻을 수 있는 최대 점수를 구하는 것입니다. 예제로 이해하기 입력이 nums = [2, 3, 4, 5, 6]라고 해봅시다. 최적의 제거 순서는 다음과 같습니다. 먼저 5를 선택합니다. 점수는 (4 + 5 + 6) = 15이고, 리
숫자로 이루어진 리스트 nums와 정수 k가 주어졌을 때, 리스트의 왼쪽 또는 오른쪽 끝에서 정확히 k번 원소를 제거한다고 가정해 봅시다. 이때 제거할 수 있는 원소들의 합 중 최댓값을 구하는 것이 목표입니다.문제 예시예를 들어 입력이 다음과 같다고 해보겠습니다.nums = [2, 4, 5, 3, 1]k = 2이 경우 출력은 6이 됩니다. 왼쪽 끝에서 2와 4를 차례로 제거하면 합이 6이 되기 때문입니다.풀이 접근 방법이 문제는 슬라이딩 윈도우(Sliding Window) 기법으로 효율적으로 해결할 수 있습니다. 처음에는 왼쪽에서
문제 정의 숫자로 이루어진 리스트 nums와 두 개의 값 x, y가 주어졌다고 가정해 보겠습니다. 이때 길이가 각각 x와 y이면서 서로 겹치지 않는 두 하위 리스트(sublist)의 최대 합을 구해야 합니다. 예를 들어 입력이 nums = [3, 2, 10, -2, 7, 6], x = 3, y = 1이라면 결과는 22가 됩니다. 길이가 3인 하위 리스트로는 [3, 2, 10](합계 15)을 선택하고, 나머지 하나로는 [7](합계 7)을 선택하면 15 + 7 = 22가 되기 때문입니다. 풀이 접근 방법 이 문제는 누적 합(prefi
문제 소개 두 명의 플레이어가 번갈아 진행하는 게임의 상태를 하나의 이진 트리(binary tree)로 표현한다고 가정해 보겠습니다. 모든 내부 노드는 0으로 초기화되어 있으며, 리프 노드의 값은 해당 경로가 종료되었을 때 얻게 되는 최종 점수를 나타냅니다. 플레이어 1은 최종 점수를 최대화(maximize)하려고 하고, 반대로 플레이어 2는 최종 점수를 최소화(minimize)하려고 합니다. 플레이어 1은 항상 짝수 레벨(루트를 0번 레벨로 가정)에서 수를 두고, 플레이어 2는 홀수 레벨에서 수를 둡니다. 두 플레이어 모두 최선의
문제 개요같은 길이를 가진 두 개의 숫자 리스트 A와 B가 있다고 가정해 봅시다. 우리는 임의의 인덱스 i에서 A[i]와 B[i]의 값을 서로 맞바꾸는(스왑) 연산을 원하는 만큼 수행할 수 있습니다. 목표는 두 리스트가 모두 엄격하게 증가(strictly increasing)하도록 만드는 데 필요한 최소 연산(스왑) 횟수를 구하는 것입니다.예를 들어 입력이 A = [2, 8, 7, 10], B = [2, 4, 9, 10]라고 해 보겠습니다. A의 7과 B의 9를 한 번만 스왑하면 A = [2, 8, 9, 10], B = [2, 4,
숫자 리스트 nums가 주어졌을 때, 이 중에서 두 개의 숫자 쌍을 선택하여 두 쌍의 합 사이의 절대 차이가 최소가 되도록 만드는 프로그램을 작성하는 문제입니다.예를 들어 입력이 nums = [3, 4, 5, 10, 7]이라면 출력은 1이 됩니다. (3 + 7) - (4 + 5) = 1이 되는 두 쌍을 선택할 수 있고, 이보다 작은 차이를 만들 수 없기 때문입니다.문제 해결 접근 방법이 문제는 다음 단계를 따라 해결할 수 있습니다.거리 정보를 저장할 새로운 리스트 distances를 생성합니다.i를 0부터 nums의 크기 - 2까지
문제 정의 숫자로 이루어진 리스트 nums가 주어졌을 때, 다음 조건을 만족하면서 합이 가장 작은 부분 수열(subsequence)을 찾는 것이 목표입니다. 연속된 세 개의 숫자로 이루어진 모든 그룹에서 적어도 하나의 숫자를 선택해야 합니다. 리스트의 길이가 3보다 작더라도 반드시 하나의 숫자는 선택해야 합니다. 예를 들어 입력이 nums = [2, 3, 4, 5, 6, 7]이라면 출력은 7입니다. 2와 5만 선택하면 조건을 만족하면서 합이 최소가 되기 때문입니다. 접근 방법: 동적 계획법(Dynamic Programming)
문제 개요 숫자로 이루어진 리스트 nums가 주어졌다고 가정해 봅시다. 이 리스트는 어떤 트리를 중위 순회(inorder traversal)했을 때 나오는 잎(leaf) 노드들을 순서대로 나타낸 것입니다. 여기서 각 내부(internal) 노드는 반드시 두 개의 자식을 가지며, 그 값은 왼쪽 서브트리의 최대 잎 값 × 오른쪽 서브트리의 최대 잎 값과 같습니다. 우리가 구해야 할 답은 이 조건을 만족하는 트리들 중에서 노드 값들의 총합이 가장 작은 트리의 합입니다. 예를 들어 입력이 nums = [3, 5, 10]이라면 정답은 83입
문제 설명 숫자 리스트 nums와 정수 k가 주어집니다. 리스트의 임의의 원소를 1씩 증가시키는 연산을 최대 k번까지 수행할 수 있을 때, 만들어 낼 수 있는 숫자 중 가장 자주 등장하는 값을 구하는 것이 목표입니다. 만약 조건을 만족하는 숫자가 여러 개라면 그중 가장 작은 값을 선택해야 합니다. 예를 들어 입력이 다음과 같다고 해보겠습니다. nums = [1, 0, 0, 0, 8, 8, 8, 8], k = 8 이 경우 출력은 8입니다. 값 1을 7번 증가시켜 8로 만들고, 0 하나를 1로 증가시키면 리스트는 [8, 1, 0, 0
여러 영화의 상영 시간이 담긴 구간(interval) 목록이 주어졌을 때, 이 영화들을 겹치는 시간 없이 모두 상영하기 위해 필요한 최소 영화관 수를 구하는 문제를 살펴보겠습니다. 각 구간은 서로 겹칠 수 있으며, 동시에 상영되는 영화가 많아질수록 더 많은 영화관이 필요합니다.문제 예시예를 들어 입력이 다음과 같다고 가정해 보겠습니다.intervals = [[20, 65], [0, 40], [50, 140]]이 경우 출력은 2가 됩니다. 그 이유는 다음과 같습니다.[20, 65]와 [0, 40]은 시간이 겹치므로 서로 다른 영화관에
서로 다른 숫자로 이루어진 리스트 nums와 하나의 숫자 k가 주어졌을 때, 원소들의 합이 정확히 k가 되는 고유한 조합의 개수를 구하는 문제입니다. 조합을 만들 때는 같은 숫자를 여러 번 재사용할 수 있습니다. 예를 들어 입력이 nums = [2, 4, 5], k = 4라고 한다면 출력은 2가 됩니다. [2, 2]와 [4], 이렇게 두 가지 조합으로 합이 4를 만들 수 있기 때문입니다. 동적 계획법(DP)을 이용한 풀이 이 문제는 동적 계획법을 활용하면 효율적으로 해결할 수 있습니다. 풀이 과정은 다음과 같습니다. 크기가 k
문제 소개숫자 n이 주어졌을 때, 사전식(lexicographic) 순서로 정렬된 처음 n개의 숫자를 찾아야 합니다. 사전식 순서란 숫자를 문자열처럼 취급하여 사전에서 단어를 정렬하듯이 순서를 매기는 방식을 의미합니다.예를 들어 입력이 n = 15라면 출력은 다음과 같습니다.[1, 10, 11, 12, 13, 14, 15, 2, 3, 4, 5, 6, 7, 8, 9]일반적인 오름차순(1, 2, 3, …)과 달리 사전식 순서에서는 10이 2보다 앞에 위치합니다. 숫자를 문자열로 비교할 때 첫 자리 1이 2보다 작기 때문입니다.알고리즘
문제 설명숫자 n과 값 k가 주어진다고 가정해 봅시다. 이때 0, 1, 2 세 문자만으로 구성되면서 같은 문자가 연속해서 나오지 않는 길이 n의 문자열을 생각해 보겠습니다. 이 조건을 만족하는 문자열들 중에서 사전순(lexicographical order)으로 k번째에 해당하는 문자열을 찾아야 하며, 만약 k번째 문자열이 존재하지 않는다면 빈 문자열을 반환하면 됩니다.예를 들어 입력이 n = 4, k = 2라면 출력은 0120이 됩니다.풀이 접근 방법이 문제는 재귀 호출을 이용해 깔끔하게 해결할 수 있습니다. 핵심 아이디어는 다음과
문제 소개숫자 n이 주어졌을 때, n보다 작거나 같은 수 중에서 모든 자릿수가 감소하지 않는(왼쪽에서 오른쪽으로 갈수록 같거나 커지는) 가장 큰 수를 찾아야 합니다.예를 들어 입력이 n = 221이라면 출력은 199입니다. 221은 마지막에 2 → 1로 자릿수가 줄어드는 부분이 있지만, 199는 1 ≤ 9 ≤ 9 조건을 만족하기 때문입니다.해결 접근 방법이 문제는 숫자를 뒤에서부터 검사하면서 자릿수가 어긋나는 지점을 찾는 방식으로 해결할 수 있습니다. 알고리즘의 단계는 다음과 같습니다.n의 모든 자릿수를 리스트(digits)로 변환
각 분수가 [분자, 분모] 형태의 리스트로 표현된 분수 목록이 주어졌다고 가정해 보겠습니다. 여기서 각 리스트는 하나의 분수(분자 / 분모)를 나타내며, 우리는 서로의 합이 정확히 1이 되는 분수 쌍의 개수를 찾아야 합니다.예를 들어 입력이 다음과 같다면,fractions = [[2, 7], [3, 12], [4, 14], [5, 7], [3, 4], [1, 4]]출력은 4가 됩니다. (2/7 + 5/7), (3/12 + 3/4), (3/4 + 1/4), (4/14 + 5/7)의 네 쌍이 모두 합이 1이 되기 때문입니다.해결 접근
리스트 nums와 두 개의 값 k, target이 주어졌을 때, 크기가 정확히 k이면서 평균값이 target 이상인 연속된 부분 리스트(sublist)의 개수를 구하는 문제입니다.예를 들어 입력이 nums = [1, 10, 5, 6, 7], k = 3, target = 6이라면 출력은 2가 됩니다. 길이 3인 부분 리스트 중 [10, 5, 6]의 평균은 7, [5, 6, 7]의 평균은 6으로, 이 두 개가 조건을 만족하기 때문입니다.접근 방법: 슬라이딩 윈도우(Sliding Window)모든 부분 리스트를 매번 처음부터 다시 계산하
문제 개요숫자로 이루어진 리스트 nums와 목표 값 target이 주어졌을 때, 원소들의 합이 target과 같아지는 연속된 부분 리스트(sublist)의 개수를 구하는 문제입니다.예를 들어 nums = [3, 0, 3], target = 3이라면, 합이 3이 되는 부분 리스트는 [3], [3, 0], [0, 3], [3]으로 총 4개이므로 결과값은 4가 됩니다.해결 접근 방식모든 부분 리스트를 일일이 확인하는 브루트 포스 방식은 O(n²) 이상의 시간이 걸립니다. 반면 누적 합(prefix sum)과 해시맵을 활용하면 O(n) 시
문제 개요서로 다른 숫자들로 이루어진 리스트가 주어졌을 때, 이 리스트를 오름차순으로 정렬하기 위해 필요한 최소 교환(swap) 횟수를 구하는 문제입니다.예를 들어 입력이 nums = [3, 1, 7, 5]라고 가정해 보겠습니다. 먼저 3과 1을 교환하고, 그다음 5와 7을 교환하면 [1, 3, 5, 7]이 되므로 정답은 2가 됩니다.해결 접근 방법핵심 아이디어는 간단합니다. 원본 리스트를 정렬한 결과(sort_seq)를 미리 만들어 두고, 각 위치에 실제로 있어야 할 값과 현재 들어 있는 값을 비교하며 자리를 바꿔 나가는 방식입니
문제 개요이진 트리가 하나 주어졌을 때, 유일한 자식(only child)에 해당하는 노드의 개수를 구하는 것이 목표입니다. 여기서 어떤 노드 x가 유일한 자식 노드라는 것은, 그 부모 노드가 정확히 하나의 자식, 즉 x만을 가지고 있는 경우를 의미합니다.예를 들어 다음과 같은 트리가 입력으로 주어진다면:출력은 2가 됩니다. 값이 8인 노드와 값이 6인 노드가 각각 부모 입장에서 유일한 자식이기 때문입니다.풀이 접근 방법이 문제는 너비 우선 탐색(BFS)을 활용하면 직관적으로 해결할 수 있습니다. 큐(데크)를 사용해 트리를 레벨 순
문제 설명숫자로 이루어진 리스트 nums와 정수 k가 주어집니다. 여기서 연산이란 리스트의 임의의 요소에서 1을 빼는 것을 의미하며, 이 연산은 총 k번까지 수행할 수 있습니다. 우리의 목표는 k번의 연산을 모두 사용한(또는 일부만 사용한) 후, 리스트 내에서 가장 큰 값이 될 수 있는 최솟값, 즉 최댓값의 최솟값을 구하는 것입니다.예를 들어 입력이 nums = [3, 4, 6, 5], k = 6이라면 출력은 3이 됩니다. 4를 한 번, 6을 세 번, 5를 두 번 감소시켜 총 6번의 연산으로 리스트를 [3, 3, 3, 3]으로 만들