길이가 n인 나무 막대와 자를 수 있는 위치를 담은 배열 cuts가 주어진다고 가정해 봅시다. 막대는 0부터 n까지의 위치로 표시되며, cuts[i]는 잘라낼 수 있는 위치를 의미합니다. 모든 컷을 반드시 수행해야 하지만, 그 순서는 원하는 대로 변경할 수 있습니다. 이때 한 번의 컷 비용은 잘라야 하는 막대 조각의 길이이며, 전체 비용은 모든 컷 비용의 합입니다. 우리가 구해야 하는 것은 이 컷들의 최소 총 비용입니다.예를 들어, 입력이 n = 7, cuts = [5,1,4,3]이라면 출력은 16이 됩니다. 컷 순서를 [3,5,1
문제 개요숫자 n이 주어지고, 주방에는 n개의 오렌지가 있다고 가정해 봅시다. 우리는 매일 아래 세 가지 규칙 중 단 하나만 선택해 오렌지를 먹어야 합니다.오렌지 1개를 먹는다.n이 짝수라면 n/2개의 오렌지를 한 번에 먹는다.n이 3으로 나누어 떨어지면 2×(n/3)개의 오렌지를 한 번에 먹는다.목표는 이 규칙을 지키면서 n개의 오렌지를 모두 먹는 데 필요한 최소 일수를 구하는 것입니다.입력 예시와 단계별 풀이예를 들어 n = 10일 때 정답은 4입니다. 과정을 살펴보면 다음과 같습니다.1일차: 오렌지 1개 섭취 → 10 − 1
문제 소개m × n 크기의 문자로 구성된 2차원 배열 grid가 주어졌을 때, 그리드 안에 사이클(cycle)이 존재하는지 판별하는 프로그램을 파이썬으로 작성해 보겠습니다.여기서 사이클이란 길이가 4 이상이면서 시작 지점과 끝 지점이 같은 경로를 의미합니다. 이동은 상·하·좌·우 네 방향으로만 가능하고, 이동하려는 칸은 반드시 현재 칸과 같은 값을 가져야 하며, 한 번 방문한 칸은 다시 방문할 수 없습니다.예시다음과 같은 4×4 그리드가 입력으로 주어졌다고 가정해 봅시다.mmmpmkmmmmsmfmmm이때 출력은 True입니다. 초록
0부터 n-1까지 번호가 매겨진 n개의 정점으로 이루어진 무방향 그래프가 주어졌다고 가정해 보겠습니다. 그래프의 각 간선에는 가중치가 부여되어 있으며, 가중치는 세 가지 유형 중 하나로 각각 특정한 의미를 가집니다. 그래프를 탐색하는 사람은 Jack과 Casey 두 명입니다. Jack은 가중치가 1인 간선만 통과할 수 있고, Casey는 가중치가 2인 간선만 통과할 수 있으며, 가중치가 3인 간선은 두 사람 모두 통과할 수 있습니다. 우리의 목표는 불필요한 간선을 제거하여 두 사람 모두 그래프 전체를 탐색할 수 있도록 만드는 것입
문제 설명 두 개의 숫자 문자열 s와 t가 주어집니다. 우리는 다음 연산을 원하는 횟수만큼 반복하여 문자열 s를 t로 변환할 수 있는지 확인해야 합니다. s에서 비어 있지 않은 부분 문자열(substring) 하나를 선택합니다. 선택한 부분 문자열을 제자리(in-place)에서 오름차순으로 정렬합니다. 예를 들어 입력이 s = "95643", t = "45963"이라면 결과는 True입니다. "95643" → "95463" → "45963"
문제 소개 여러 개의 돌이 한 줄로 놓여 있고, 각 돌에는 배열 stoneValue에 담긴 숫자 값이 하나씩 매겨져 있다고 가정해 보겠습니다. 매 라운드마다 Amal은 돌 줄을 두 부분으로 나누고, Bimal은 각 부분의 값, 즉 해당 부분에 속한 모든 돌 값의 합을 계산합니다. 그다음 Bimal은 값이 더 큰 부분을 버리고, 남은 부분의 값만큼 Amal의 점수가 증가합니다. 두 부분의 값이 같을 경우에는 Amal이 직접 어느 쪽을 버릴지 결정할 수 있습니다. 다음 라운드는 남은 부분에서 다시 시작되며, 돌이 하나만 남으면 게임이
문제 이해하기정수 배열 nums와 값 k가 주어진다고 가정해 보겠습니다. 한 번의 연산에서는 배열에서 두 원소를 선택했을 때 그 합이 정확히 k가 되면 해당 원소 두 개를 배열에서 제거할 수 있습니다. 이때 수행할 수 있는 최대 연산 횟수를 구하는 것이 이 문제의 목표입니다.예를 들어, nums = [8, 3, 6, 1, 5], k = 9인 경우를 살펴보겠습니다. 먼저 합이 9가 되는 [3, 6]을 제거하고, 이어서 역시 합이 9가 되는 [8, 1]을 제거할 수 있으므로 정답은 2가 됩니다.접근 방법이 문제는 해시 맵(Python의
이 문제에서는 두 개의 배열이 주어집니다. 하나는 베이스(아이스크림 기반)의 가격을 담은 baseCosts(n개 요소)이고, 다른 하나는 토핑의 가격을 담은 toppingCosts(m개 요소)입니다. 그리고 목표 가격을 나타내는 target 값도 함께 주어집니다.디저트를 만들 때는 아래 규칙을 반드시 따라야 합니다.베이스는 정확히 하나만 선택해야 합니다.토핑은 하나 이상 추가하거나, 아예 추가하지 않아도 됩니다.각 종류의 토핑은 최대 2개까지 사용할 수 있습니다.여기서 baseCosts[i]는 i번째 아이스크림 베이스의 가격, to
문제 설명 숫자 n이 주어졌을 때, 1부터 n까지 각 숫자의 이진 표현을 순서대로 하나씩 이어 붙여 만들어진 이진 문자열의 십진수 값을 구하는 것이 목표입니다. 만약 결과값이 너무 커진다면 10^9 + 7로 나눈 나머지를 반환하면 됩니다. 예를 들어 입력이 n = 4라면 출력은 220이 됩니다. 1부터 4까지의 이진 표현을 차례대로 이어 붙이면 "1" + "10" + "11" + "100" = 110111000이 되고, 이 값은 바로 십진수 220의 이진 표현이
문제 소개두 개의 배열 nums1과 nums2가 있다고 가정해 보겠습니다. 배열에 담긴 값은 모두 1부터 6 사이(양 끝값 포함)입니다. 한 번의 연산으로 두 배열 중 어느 곳의 값이든 1~6 범위 안의 다른 값으로 변경할 수 있으며, 우리의 목표는 두 배열의 원소 합을 같게 만드는 데 필요한 최소 연산 횟수를 구하는 것입니다. 만약 어떻게 해도 두 합을 같게 만들 수 없다면 -1을 반환해야 합니다.예를 들어 입력이 nums1 = [1,5,6], nums2 = [4,1,1]이라면 답은 2가 됩니다. 첫 번째 연산에서 nums2를 [
문제 개요비내림차순(오름차순)으로 정렬된 배열 nums가 주어졌다고 가정해 봅시다. 이때 nums와 길이가 같은 배열 result를 만들어야 하며, result[i]에는 nums[i]와 배열 안의 다른 모든 원소들 사이의 절대 차이의 합이 저장되어야 합니다.예를 들어 입력이 nums = [5, 7, 12]라면 출력은 [9, 7, 12]가 됩니다. 그 이유는 다음과 같습니다.|5−5| + |5−7| + |5−12| = 0 + 2 + 7 = 9|7−5| + |7−7| + |7−12| = 2 + 0 + 5 = 7|12−5| + |12−7
문제 설명 배열 nums가 주어졌다고 가정해 보겠습니다. 여기서 램프(ramp)란 i < j이면서 nums[i] <= nums[j]를 만족하는 튜플 (i, j)를 의미하며, 이러한 램프의 너비는 (j - i)로 정의됩니다. 목표는 nums에서 최대 너비를 가진 램프를 찾는 것이고, 조건을 만족하는 램프가 존재하지 않는다면 0을 반환해야 합니다. 예를 들어 입력이 nums = [6,0,8,2,1,5]라면 결과는 4가 됩니다. 최대 너비의 램프는 (i, j) = (1, 5)에서 얻어지며, 이때 nums[1] = 0이고 nu
Amal과 Bimal이 돌 가져오기 게임을 하고 있으며, Amal이 먼저 시작한다고 가정해 보겠습니다. 게임의 규칙은 다음과 같습니다.한 더미에 n개의 돌이 놓여 있습니다. 각 플레이어는 자신의 차례에 돌 하나를 가져가며, 해당 돌의 위치에 따라 점수를 받게 됩니다. 흥미로운 점은 Amal과 Bimal이 같은 돌을 서로 다르게 평가할 수 있다는 것입니다.두 개의 배열 A_Values와 B_Values가 주어집니다. A_Values[i]는 Amal이, B_Values[i]는 Bimal이 i번째 돌에 부여하는 가치를 나타냅니다. 모든
문제 개요문자열 형태의 숫자 n이 주어졌을 때, 그 합이 n과 같아지는 데시바이너리(deci-binary) 수의 최소 개수를 구하는 문제입니다. 여기서 데시바이너리 수란 각 자릿수가 0 또는 1로만 이루어진 십진수를 의미합니다.예를 들어 입력이 n = 132라면 출력은 3이 됩니다. 132는 세 개의 데시바이너리 수인 10 + 11 + 111의 합으로 표현할 수 있기 때문입니다.해결 접근 방식이 문제는 의외로 간단하게 해결할 수 있습니다. 핵심 아이디어는 n의 각 자릿수 중 가장 큰 숫자가 곧 필요한 데시바이너리 수의 최소 개수라는
문제 개요숫자 n이 하나 주어졌을 때, 이 숫자를 서로 다른(distinct) 3의 거듭제곱들의 합으로 나타낼 수 있는지 확인해야 합니다. 여기서 정수 y가 3의 거듭제곱이라는 것은 y = 3x(x는 정수)를 만족하는 정수 x가 존재한다는 의미입니다.예를 들어 입력이 n = 117이라면 결과는 True입니다. 117 = 34 + 33 + 32, 즉 81 + 27 + 9로 표현할 수 있기 때문입니다.풀이 접근 방법이 문제는 그리디(greedy) 기법으로 간단하게 해결할 수 있습니다. 가장 큰 거듭제곱부터 차례대로 확인하면서, 현재 값
문제 개요stones라는 배열이 주어지며, stones[i]는 왼쪽에서 i번째 돌의 가치를 나타냅니다. 두 플레이어 Amal과 Bimal이 이 돌들로 번갈아 진행하는 게임을 하며, 항상 Amal이 선공입니다. n개의 돌이 일렬로 놓여 있고, 각 플레이어는 자신의 차례에 줄의 가장 왼쪽 또는 가장 오른쪽에 있는 돌을 하나 제거한 뒤, 남아 있는 돌들의 가치 합만큼 점수를 얻습니다. 최종적으로 더 높은 점수를 기록한 플레이어가 승리합니다.Bimal은 자신이 이 게임에서 필패라는 사실을 깨닫고, 지더라도 점수 차이를 최소화하는 방향으로
문제 개요 문자열 s가 주어졌을 때, 해당 문자열의 모든 부분 문자열(substring)에 대한 아름다움(beauty) 값의 합을 구하는 것이 목표입니다. 여기서 문자열의 아름다움이란 가장 많이 등장한 문자의 빈도에서 가장 적게 등장한 문자의 빈도를 뺀 값을 의미합니다. 예를 들어 문자열이 abaacc라면, a는 3번, b와 c는 각각 1번 등장하므로 아름다움은 3 - 1 = 2가 됩니다. 예시 입력이 s = xxyzy라고 가정해 보겠습니다. 이 경우 출력값은 5입니다. 그 이유는 아름다움 값이 0이 아닌 부분 문자열이 [xxy,
문제 개요 양의 정수로만 이루어진 배열 nums가 있다고 가정해 봅시다. 우리는 이 배열에서 중복되지 않는 고유한 요소로만 구성된 부분 배열(subarray)을 하나 선택해 제거(erase)하며, 이때 얻는 점수는 해당 부분 배열 요소들의 합입니다. 목표는 정확히 하나의 부분 배열을 제거했을 때 얻을 수 있는 최대 점수를 구하는 것입니다. 예를 들어 입력이 nums = [6,3,2,3,6,3,2,3,6]이라면 결과는 11이 됩니다. 최적의 부분 배열은 [6,3,2] 또는 [2,3,6]이며, 두 경우 모두 합이 11이기 때문입니다.
이번 글에서는 배열과 두 개의 값 limit, goal이 주어졌을 때, 배열의 합이 goal과 같아지도록 하기 위해 최소 몇 개의 요소를 추가해야 하는지 구하는 방법을 알아보겠습니다.문제 설명배열 nums가 있고, 이 배열은 특별한 조건을 가집니다. 즉, 모든 인덱스 i에 대해 |nums[i]| <= limit이 성립합니다. 우리는 배열의 합을 goal과 동일하게 만들기 위해 삽입해야 하는 요소의 최소 개수를 찾아야 하며, 이때 추가하는 요소 역시 limit 값을 초과해서는 안 됩니다.예를 들어, 입력이 nums = [2, -
문제 개요배열 nums와 정수 k가 주어진다고 가정해 봅시다. 우리는 인덱스 0에서 시작하며, 한 번의 이동으로 배열의 경계를 벗어나지 않는 범위 내에서 최대 k칸까지 오른쪽으로 점프할 수 있습니다. 목표는 배열의 마지막 인덱스에 도달하는 것입니다.점프할 때마다 방문하는 각 인덱스 j에 대해 nums[j] 값이 점수에 누적됩니다. 즉, 최종 점수는 방문한 모든 인덱스의 nums[j] 값의 합입니다. 이때 얻을 수 있는 최대 점수를 구하는 것이 이 문제의 핵심입니다.예를 들어, 입력이 nums = [1, -2, -5, 7, -6, 4