문제 설명숫자로 이루어진 리스트 nums가 주어졌다고 가정해 봅시다. 우리는 리스트에서 임의의 두 수를 골라 제거한 뒤, 그 두 수의 합을 리스트 끝에 추가하는 방식으로 리스트의 길이를 줄일 수 있습니다. 이때 각 연산의 비용은 제거한 두 정수의 합입니다. 목표는 nums를 하나의 정수로 줄일 때 드는 최소 총 비용을 구하는 것입니다.예시로 이해하기예를 들어 입력이 nums = [2, 3, 4, 5, 6]이라면 결과는 45입니다.2와 3을 꺼내 합친다 → [4, 5, 6, 5], 비용 54와 5를 꺼내 합친다 → [6, 5, 9],
문제 개요각 행이 [시작, 끝] 형태의 포함 범위를 나타내는 2차원 숫자 리스트 intervals가 주어져 있다고 가정해 봅시다. 구간 [a, b](a < b)의 크기는 (b − a)로 정의됩니다.여기서 우리는 이 목록에 간격(interval)을 하나 추가해야 합니다. 조건은 새로운 간격까지 모두 병합했을 때 정확히 하나의 연속된 범위만 남아야 한다는 것입니다. 이때 추가해야 할 간격의 최소 크기를 구하는 것이 문제입니다.예를 들어 입력이 다음과 같다면,intervals = [[15, 20],[30, 50]]출력은 10이 됩니
숫자로 이루어진 리스트 nums가 주어졌을 때, 같은 값이 연속해서 등장하는 요소들을 하나의 하위 리스트로 묶어야 합니다. 단, 리스트에 한 번만 나타나는 값이라도 반드시 별도의 하위 리스트로 존재해야 한다는 점에 유의하세요. 예를 들어 입력이 nums = [5, 5, 2, 7, 7, 7, 2, 2, 2, 2]라면, 출력은 [[5, 5], [2], [7, 7, 7], [2, 2, 2, 2]]가 됩니다. 여기서 앞부분의 2와 뒷부분의 2들이 서로 다른 그룹으로 분리되는 것을 확인할 수 있습니다. 문제 해결 접근 방법 이 문제는 다음과
2차원 격자(grid)에 문자열 형태의 색상 r, g, b가 저장되어 있다고 가정해 보겠습니다. 이때 r행 c열 위치에서 목표 색상(target)으로 플러드 필(flood fill) 연산을 수행해야 합니다. 플러드 필 연산이란 grid[r][c]와 상·하·좌·우로 연결되어 있으면서 시작 지점과 같은 색상을 가진 모든 칸을 한꺼번에 목표 색상으로 바꾸는 작업을 말합니다.예를 들어 입력이 다음과 같다면,RRRRGBGBB출력 결과는 아래와 같습니다.GGGGGBGBBgrid[0][0]에 연결된 빨간색(r) 칸들이 모두 초록색(g)으로 변경
문제 설명숫자로 이루어진 리스트 nums와 목표값 target이 주어졌을 때, 만들 수 있는 쌍(pair)의 최대 개수를 구하는 것이 목표입니다. 여기서 각 쌍은 인덱스 i < j를 가져야 하고, 한 인덱스는 서로 다른 쌍에 중복 사용될 수 없으며, 두 값의 절대 차이는 조건 |nums[i] - nums[j]| >= target을 만족해야 합니다.예를 들어 nums = [2, 4, 6, 10, 11], target = 5가 입력으로 주어지면 출력은 2가 됩니다. (2, 10)과 (4, 11)이라는 두 쌍을 만들 수 있으며
연결 리스트(linked list)가 하나 주어져 있다고 가정해 보겠습니다. 이 문제의 목표는 인접한 두 노드씩 짝지어 서로 교환(swap)한 뒤, 새로운 헤드(head)를 반환하는 것입니다. 여기서 중요한 제약 조건은 노드에 저장된 값 자체는 수정할 수 없고, 오직 노드 사이의 연결(포인터)만 변경할 수 있다는 점입니다. 예를 들어 리스트가 [1, 2, 3, 4]라면, 두 노드씩 교환한 결과는 [2, 1, 4, 3]이 됩니다. 해결 접근 방식 이 문제는 더미(dummy) 노드를 활용하면 깔끔하게 해결할 수 있습니다. 더미 노드는
문제 정의연결 리스트가 하나 주어져 있을 때, 리스트를 구성하는 요소들이 회문(palindrome)을 이루는지 확인해야 합니다. 회문이란 앞에서부터 읽으나 뒤에서부터 읽으나 순서가 동일한 수열이나 문자열을 의미합니다.예를 들어 리스트가 [5, 4, 3, 4, 5]라면 어느 방향에서 읽어도 같으므로 회문입니다. 반면 [5, 4, 3, 2, 1]은 뒤집으면 [1, 2, 3, 4, 5]가 되어 원래 순서와 다르므로 회문이 아닙니다.해결 전략이 문제는 리스트를 배열에 복사하지 않고도 투 포인터(Two Pointer) 기법과 연결 리스트 뒤
문자열 s가 주어졌을 때, s의 문자들을 재배열하여 만들 수 있는 순열(permutation) 중 하나라도 회문(palindrome)이 되는지 확인해야 합니다. 예를 들어 입력이 s = admma라고 가정해 보겠습니다. 이 문자열은 madam으로 재배열할 수 있고, madam은 앞에서 읽으나 뒤에서 읽으나 같은 회문이므로 결과는 True입니다. 풀이 접근 방식 실제로 모든 순열을 하나씩 만들어 확인할 필요는 없습니다. 회문의 기본 성질을 이용하면 문자 빈도 분석만으로 답을 구할 수 있습니다. 회문이 되려면 모든 문자가 짝수 번
문제 개요각 노드에 0부터 9 사이의 숫자가 저장된 이진 트리가 있다고 가정해 보겠습니다. 이때 이 트리의 중위 순회(inorder traversal) 결과가 회문(palindrome), 즉 앞뒤 어느 방향으로 읽어도 같은 수열인지 판별하는 프로그램을 작성해야 합니다.예를 들어, 입력 트리가 다음과 같다면중위 순회 결과가 [2, 6, 10, 6, 2]로 역순으로 읽어도 동일하므로 출력은 True가 됩니다.알고리즘 접근 방법스택을 활용한 반복적(iterative) 중위 순회로 트리를 탐색한 뒤, 그 결과가 회문인지 확인하는 방식으로
이진 트리(binary tree)가 하나 주어졌을 때, 두 개의 숫자로 이루어진 결과를 반환하는 프로그램을 만들어 보겠습니다. 첫 번째 숫자는 트리에 포함된 잎(leaf) 노드의 개수이고, 두 번째 숫자는 잎이 아닌(non-leaf) 노드의 개수입니다.문제 이해하기예를 들어 다음과 같은 이진 트리가 입력으로 주어진다고 가정해 봅시다.이 경우 출력은 (3, 2)가 됩니다. 잎 노드가 3개(값이 2, 10, 2인 노드)이고, 잎이 아닌 노드가 2개(값이 6, 6인 노드)이기 때문입니다.풀이 접근 방식이 문제는 재귀(recursion)를
값이 0, 1, 2로만 구성된 이진 트리(binary tree)가 있다고 가정해 봅시다. 루트 노드에는 최소한 하나의 0 노드와 하나의 1 노드가 존재합니다. 이제 트리에서 간선(edge) 하나를 삭제하면 트리가 서로 다른 두 개의 트리로 분리되는 연산이 있다고 합시다. 우리가 구해야 할 것은, 분리된 두 트리 어느 쪽에도 0 노드와 1 노드가 동시에 포함되지 않도록 간선을 삭제할 수 있는 경우의 수입니다.예를 들어 입력이 아래와 같은 트리라면,출력은 1이 됩니다. 0 노드와 2 노드 사이의 간선만이 조건을 만족하며 삭제 가능하기
문제 개요양수로 이루어진 두 개의 리스트 coins와 salaries가 있다고 가정해 보겠습니다. 여기서 coins[i]는 i번째 동전의 가치를 의미하고, salaries[j]는 j번째 작업자에게 지급해야 하는 최소 급여액을 나타냅니다.각 종류의 동전은 하나씩만 존재하며, 모든 작업자에게 정확히 하나의 동전을 지급해야 합니다. 이때 동전을 지급할 수 있는 방법의 수를 구하는 것이 목표입니다. 두 가지 지급 방법 중 어떤 작업자가 받는 동전의 종류라도 서로 다르다면, 그 두 방법은 서로 다른 것으로 간주합니다. 만약 결과값이 매우 커
문제 소개길이가 같은 두 리스트 weights와 values, 그리고 정수 capacity가 주어집니다. weights[i]와 values[i]는 각각 i번째 아이템의 무게와 가치를 의미합니다. 이 문제의 핵심 조건은 각 아이템을 여러 개의 복사본으로 자유롭게 선택할 수 있다는 점입니다. 즉, 총 무게가 capacity를 초과하지 않는 범위 안에서 아이템을 담아 얻을 수 있는 최대 가치를 구하는 프로그램을 작성해야 합니다.예를 들어 입력이 다음과 같다고 해보겠습니다.weights = [1, 2, 3]values = [1, 5, 3]
배열 nums가 주어졌을 때, 최소 한 개 이상의 숫자를 포함하는 연속된(contiguous) 부분 배열 중에서 요소들의 곱이 가장 큰 값을 찾는 문제입니다.예를 들어 배열이 [1,9,2,0,2,5]라면, 연속 부분 배열 [1,9,2]의 곱인 18이 최댓값이므로 출력 결과는 18이 됩니다.접근 방식: 동적 계획법(DP)이 문제는 단순히 현재까지의 최대 곱만 추적하면 해결되지 않습니다. 배열에 음수가 포함되어 있으면, 지금까지의 최솟값(음수)에 음수가 다시 곱해져 오히려 가장 큰 양수가 될 수 있기 때문입니다.따라서 각 위치마다 다음
음수가 아닌 정수로 이루어진 길이 n짜리 배열이 있다고 가정해 보겠습니다. 이 배열의 각 값은 높이를 나타내며, 각 막대의 너비는 1입니다. 우리가 구해야 할 것은 비가 온 후 이 지형에 고일 수 있는 물의 총량입니다. 지형은 다음과 같이 표현할 수 있습니다.위 그림에서 파란색 칸이 8개 있는 것을 확인할 수 있습니다. 따라서 이 경우 출력 결과는 8이 됩니다.문제 해결 접근 방법이 문제는 스택(Stack) 자료구조를 활용하면 효율적으로 해결할 수 있습니다. 핵심 아이디어는 현재 막대보다 낮은 막대들을 스택에 쌓아두었다가, 더 높은
숫자 리스트 nums와 연산 리스트가 주어졌을 때, 각 연산은 세 개의 필드 [L, R, X]로 구성됩니다. 이는 인덱스 L부터 R까지(양 끝 포함)의 모든 요소를 X만큼 증가시키라는 의미입니다. 모든 연산을 적용한 후 최종 리스트를 반환해야 합니다.문제 예시입력이 다음과 같다고 가정해 보겠습니다.nums = [8, 4, 2, -9, 4]operations = [[0, 0, 3], [1, 3, 2], [2, 3, 5]]이 경우 출력은 [11, 6, 9, -2, 4]가 됩니다. 연산 과정을 단계별로 살펴보면 다음과 같습니다.첫 번째
파이썬으로 코딩하다 보면 리스트 안에서 두 번 이상 반복해서 등장하는 요소를 제거하고, 오직 한 번만 나타난 항목만 원래의 순서대로 남겨야 하는 상황이 종종 발생합니다. 이 글에서는 그 문제를 해결하는 알고리즘과 실제 코드를 단계별로 살펴보겠습니다.문제 정의숫자로 이루어진 리스트 nums가 주어졌다고 가정해 봅시다. 이때 여러 번 등장하는 숫자들은 모두 제거하고, 원본 리스트에서 처음 나타난 순서는 그대로 유지해야 합니다.예를 들어 입력이 nums = [2, 4, 6, 1, 4, 6, 9]라면 출력은 [2, 1, 9]가 됩니다. 4
문제 개요숫자로 구성된 연결 리스트가 주어졌을 때, 여러 번 등장하는 숫자들을 제거하고 각 숫자는 한 번만 남기는 프로그램을 만들어야 합니다. 이때 중요한 조건은 원본 연결 리스트에서의 등장 순서를 그대로 유지해야 한다는 점입니다.예를 들어, 입력이 9]라면, 4와 6이 중복되므로 출력은 9]가 됩니다.해결 방법이 문제는 집합(Set) 자료구조를 활용하면 효율적으로 해결할 수 있습니다. 집합은 특정 값이 이미 존재하는지 O(1) 시간에 확인할 수 있기 때문입니다. 알고리즘의 동작 단계는 다음과 같습니다.노드가 null이 아닌 경
괄호로만 이루어진 문자열이 주어졌을 때, 모든 여는 괄호가 반드시 닫히는 올바른 문자열을 만들기 위해 제거해야 할 괄호의 최소 개수를 구하는 문제입니다.예를 들어 입력이 (()))( 라면, 올바른 문자열은 (()) 이고 )( 부분을 제거하면 되므로 정답은 2가 됩니다.문제 해결 접근 방식이 문제는 스택 없이도 두 개의 카운터 변수만으로 효율적으로 해결할 수 있습니다.total: 아직 짝이 맞지 않는 여는 괄호 ( 의 개수temp: 매칭에 실패한 닫는 괄호 ) 의 개수알고리즘 단계total = 0, temp = 0 으로 초기화합니다.
문제 개요문자열 s가 주어졌을 때, 가장 앞에 나타나는 연속된 중복 문자 묶음을 반복적으로 삭제한 후 최종적으로 남는 문자열을 구하는 문제입니다.예를 들어 입력이 s = "xyyyxxz"라면 결과는 "z"입니다. 먼저 첫 번째 연속 중복인 "yyy"를 삭제하면 "xxxz"가 되고, 이어서 "xxx"를 삭제하면 최종적으로 "z"만 남게 됩니다.접근 방법: 스택(Stack) 활용이 문제는 스택 자료구조를 활용하면 한 번의 순회로