단일 연결 리스트(singly linked list)의 헤드 노드가 주어졌을 때, 리스트의 중간 노드 값을 찾는 것이 이번 문제의 목표입니다. 리스트의 길이가 짝수여서 중간에 해당하는 노드가 두 개라면, 그중 두 번째 중간 노드의 값을 반환해야 합니다. 또한 전체 리스트를 딱 한 번만 순회(single pass)하는 조건 안에서 해결해야 한다는 점이 핵심 제약입니다.예를 들어 입력이 [5,9,6,4,8,2,1,4,5,2]라면 출력은 2가 됩니다. 리스트 길이가 10으로 짝수이므로 다섯 번째 요소(8)와 여섯 번째 요소(2)가 모두
숫자 리스트 nums가 주어졌을 때, 같은 길이의 새로운 리스트를 만들어야 합니다. 이때 인덱스 i에 들어갈 값은 nums[i]의 오른쪽에서 가장 가까운 더 큰 요소입니다. 만약 오른쪽에 더 큰 수가 없다면 리스트의 맨 앞으로 돌아가서(원형 순회) 확인하고, 그래도 더 큰 수가 존재하지 않으면 -1로 설정합니다.예를 들어 입력이 [4, 5, 1, 3]이라면 출력은 [5, -1, 3, 4]가 됩니다.해결 접근 방식이 문제는 모노토닉 스택(Monotonic Stack) 기법과 두 번의 순회를 활용하면 효율적으로 해결할 수 있습니다. 단
이진 트리(binary tree)가 주어졌을 때, 루트 노드에서 리프 노드까지 이어지는 모든 경로 중 합이 가장 큰 값을 찾아야 합니다. 문제 예시 예를 들어 아래와 같은 트리가 입력으로 주어진다고 가정해 보겠습니다. 루트에서 출발하여 5 → 9 → 7 → 8 순서로 경로를 따라 내려가면 각 노드의 값을 모두 더한 결과가 29가 되므로, 출력은 29입니다. 풀이 접근 방법 이 문제는 깊이 우선 탐색(DFS)을 활용한 재귀 함수로 간단하게 해결할 수 있습니다. 단계별로 살펴보면 다음과 같습니다. walk() 함수를 정의합니다. 이
문제 개요각 칸에 동전이 저장되어 있는 2차원 행렬(격자)이 있다고 가정해 보겠습니다. [0,0] 위치에서 출발하여 오른쪽 또는 아래로만 이동할 수 있을 때, 오른쪽 아래 모서리에 도달하기까지 수집할 수 있는 최대 동전 수를 구하는 것이 목표입니다.입력 예시14220005위 입력에 대한 출력은 14입니다. 경로 [1, 4, 2, 2, 5]를 따라 이동하면 각 칸의 동전을 모두 더해 최댓값을 얻을 수 있습니다.풀이 접근 방식: 동적 계획법(DP)이 문제는 각 칸에 도달했을 때의 최대 누적 동전 수를 저장하는 방식으로 효율적으로 해결할
문제 소개 2차원 행렬 M이 있다고 가정해 보겠습니다. 각 셀에는 자신의 색상을 나타내는 값이 저장되어 있으며, 상하좌우로 인접하면서 같은 색을 가진 셀들은 하나의 그룹으로 묶입니다. 여기서 그룹에 속한 모든 셀을 특정 색상으로 한꺼번에 바꾸는 연산을 정의합니다. 목표는 모든 셀을 같은 색으로 만들기 위해 필요한 최소 연산 횟수를 구하는 것이며, 한 번 색이 변환된 그룹은 다시는 다른 색으로 바꿀 수 없다는 제약 조건이 있습니다. 예를 들어 입력이 다음과 같다고 해보겠습니다. 222211112321 이 경우 출력은 2입니다. 색상
행렬 M과 같은 행·열 크기를 가진 목표 행렬 T가 있다고 가정해 보겠습니다. 여기서 연산이란 행렬의 특정 열 하나를 뒤집는 작업으로, 해당 열에 있는 모든 1은 0으로, 모든 0은 1로 바뀝니다. 이때 행의 순서는 자유롭게 재배열할 수 있으며 비용이 들지 않습니다. 이 조건에서 M을 T로 변환하는 데 필요한 최소 연산 횟수를 구하는 프로그램을 작성해야 하며, 변환이 불가능하다면 -1을 반환합니다.예를 들어 입력이 다음과 같다고 해보겠습니다.M =001011T =011011이 경우 출력은 1입니다. 먼저 행의 순서를 다음처럼 재배열
완전 이진 트리(Complete Binary Tree)란?이진 트리가 하나 주어졌을 때, 이 트리가 완전 이진 트리인지 아닌지를 판별하는 프로그램을 만들어 보겠습니다.완전 이진 트리는 다음 조건을 만족하는 트리입니다.마지막 레벨을 제외한 모든 레벨이 노드로 가득 차 있어야 합니다.마지막 레벨의 노드들은 가능한 한 왼쪽에 몰려 있어야 합니다.예를 들어 아래와 같은 트리가 입력으로 주어지면, 모든 노드가 왼쪽부터 차례대로 채워져 있으므로 출력 결과는 True가 됩니다.해결 전략: BFS(레벨 순회) 활용이 문제는 큐(queue)를 이용
문제 개요0부터 n-1까지의 숫자로 표현되는 n개의 도시가 있고, 한 도시를 다른 도시와 연결하는 일방통행 도로 목록이 주어집니다. 이때 어떤 도시에서 출발하더라도 나머지 모든 도시에 도달할 수 있는지 확인해야 합니다.예를 들어, 입력이 n = 3, roads = [[0, 1], [0, 2], [1, 0], [1, 2], [2, 0], [2, 1]]이라면 출력은 True가 됩니다. 0번 도시에서 1번으로 갈 수 있고, 1번에서도 0번으로 돌아올 수 있기 때문입니다. 실제로 모든 도시 쌍 사이에 왕복 경로가 존재합니다.해결 접근 방법
문제 개요숫자로 이루어진 문자열 s가 주어졌을 때, 이 문자열이 연속적으로 감소하는 정수, 즉 내림차순으로 이어지는 정수들을 포함하고 있는지 확인해야 합니다.예를 들어 입력이 s = 99989796이라면, 이 문자열은 [99, 98, 97, 96]으로 나눌 수 있으므로 결과는 True입니다.해결 접근 방법이 문제는 재귀(백트래킹) 방식으로 해결할 수 있습니다. 핵심 아이디어는 문자열의 앞부분에서 첫 번째 숫자를 잘라낸 뒤, 그 숫자보다 1 작은 값이 뒤따라 오는지 재귀적으로 검사하는 것입니다.단계별 풀이 과정은 다음과 같습니다.he
중복되지 않는 숫자로 이루어진 리스트 nums가 있다고 가정해 보겠습니다. 이때 우리가 해야 할 일은, 리스트 안에서 서로 연속된 숫자들을 하나의 포괄적 구간(inclusive interval)으로 요약한 2차원 행렬을 정렬된 형태로 만드는 것입니다.문제 이해하기예를 들어 입력이 다음과 같다고 해봅시다.nums = [10, 11, 12, 15, 16, 17, 28, 30]그렇다면 출력은 아래와 같습니다.[[10, 12], [15, 17], [28, 28], [30, 30]]리스트에서 10부터 12까지, 그리고 15부터 17까지는 각
문제 소개 숫자 n이 하나 주어집니다. 이때 0부터 n-1까지, 즉 [0, n) 범위의 값들을 사용해 만들 수 있는 서로 다른 이진 탐색 트리(Binary Search Tree, BST)의 개수를 구하는 것이 목표입니다. 답이 지나치게 커질 수 있으므로, 최종 결과는 109+7로 나눈 나머지를 반환합니다. 예를 들어 입력이 n = 3이라면, 만들 수 있는 고유한 BST의 개수는 5가 됩니다. 핵심 아이디어: 카탈란 수(Catalan Number) BST의 구조는 노드에 들어가는 실제 값이 아니라 노드의 개수에 의해서만 결정됩니다.
문제 개요여는 괄호 "("와 닫는 괄호 ")"로만 이루어진 문자열 s가 주어졌다고 가정해 보겠습니다. 이때 문자열 안의 괄호들이 서로 균형을 이루고 있는지 확인해야 합니다.예를 들어 입력이 s = "(()())(())"라면 모든 괄호가 올바른 순서로 짝을 이루고 있으므로 출력은 True입니다. 반대로 닫는 괄호가 먼저 등장하거나, 여는 괄호가 닫히지 않은 채 문자열이 끝난다면 False를 반환해야 합니다.풀이 접근 방식이 문제는 별도의 스택 자료구조 없이 하나의 정수 카운터만으로
소괄호 (), 중괄호 {}, 대괄호 []로 이루어진 문자열이 주어졌을 때, 이 괄호들이 균형 잡힌(well-formed) 올바른 형태인지 확인하는 문제입니다.예를 들어 입력이 s = ([()()]{[]})()라면 모든 괄호가 올바르게 짝을 이루고 있으므로 결과는 True가 됩니다.문제 해결 접근 방식이 문제는 스택(Stack) 자료구조를 활용하면 효율적으로 해결할 수 있습니다. 알고리즘의 동작 과정은 다음과 같습니다.빈 리스트로 스택(stack)을 초기화합니다.닫는 괄호를 키로, 여는 괄호를 값으로 갖는 해시 맵을 생성합니다. 즉,
문제 설명 BST(이진 탐색 트리)와 두 값 low, high가 주어졌을 때, [low, high] 범위(양 끝값 포함)에 속하지 않는 모든 노드를 삭제하는 것이 목표입니다. 예를 들어 다음과 같은 트리가 있다고 가정해 보겠습니다. 여기서 low = 7, high = 10이라면, 범위를 벗어나는 노드들이 제거되어 다음과 같은 결과가 나옵니다. 해결 접근 방법 이 문제는 재귀를 활용하면 깔끔하게 해결할 수 있습니다. BST의 핵심 성질, 즉 왼쪽 서브트리의 모든 값은 부모보다 작고 오른쪽 서브트리의 모든 값은 부모보다 크다는 특성
이진 트리가 주어졌을 때, 해당 트리가 이진 탐색 트리(Binary Search Tree, BST)인지 판별하는 문제입니다. BST는 다음과 같은 성질을 만족해야 합니다.현재 노드보다 작은 값은 모두 왼쪽 서브트리에 위치합니다.현재 노드보다 큰 값은 모두 오른쪽 서브트리에 위치합니다.이 성질은 모든 노드에 대해 재귀적으로 유지되어야 합니다.예를 들어 아래와 같은 트리가 입력으로 주어지면,출력 결과는 True가 됩니다.풀이 접근 방법BST의 핵심 특징은 중위 순회(Inorder Traversal)를 수행하면 항상 오름차순으로 정렬된
문제 소개 문자열 s가 주어졌을 때, 문자열 안에서 두 문자의 위치를 최대 한 번만 교환(swap)하여 만들 수 있는 문자열 중 사전순으로 가장 작은(lexicographically smallest) 문자열을 찾는 것이 이번 문제의 목표입니다. 예를 들어 입력 문자열이 zyzx라면, 첫 번째 문자 z와 세 번째 문자 x를 맞바꿔 xyzz를 만들 수 있으며, 이것이 가능한 결과 중 가장 작은 값입니다. 알고리즘 접근 방법 이 문제는 그리디(greedy) 기법으로 효율적으로 해결할 수 있습니다. 핵심 아이디어는 각 위치 i에 대해 i
문제 개요 단일 연결 리스트(singly linked list)와 하나의 목표 값(target)이 주어졌을 때, 값이 목표 값과 동일한 모든 노드를 삭제한 뒤의 연결 리스트를 반환하는 프로그램을 만들어 보겠습니다. 예를 들어 입력 리스트가 [5, 8, 2, 6, 5, 2, 9, 6, 2, 4]이고 목표 값이 2라면, 값이 2인 노드 세 개가 모두 제거되어 최종 결과는 [5, 8, 6, 5, 9, 6, 4]가 됩니다. 해결 알고리즘 이 문제는 새로운 리스트를 만들지 않고, 기존 리스트의 포인터(next)만 조작하여 노드를 건너뛰는
단일 연결 리스트(singly linked list)가 하나 주어져 있고, 이 리스트는 최상위 비트(MSB)부터 순서대로 이진수를 표현하고 있다고 가정해 보겠습니다. 우리가 해야 할 일은 이 연결 리스트를 읽어 들여 해당하는 십진 정수로 변환하여 반환하는 것입니다.문제 이해하기예를 들어 입력이 [1, 0, 1, 1, 0]이라면, 이는 이진수 10110을 의미합니다. 이를 십진수로 바꾸면 다음과 같습니다.1×2⁴ + 0×2³ + 1×2² + 1×2¹ + 0×2⁰ = 16 + 0 + 4 + 2 + 0 = 22따라서 출력값은 22가 됩니
숫자로 이루어진 리스트 nums가 있고, 연산자를 나타내는 문자열 op(예: +, -, /, *)와 하나의 값 val이 함께 주어졌다고 가정해 봅시다. 이때 우리가 해야 할 일은 리스트의 모든 숫자에 대해 val과의 연산을 수행한 뒤, 그 결과를 새로운 리스트로 반환하는 것입니다.예를 들어 입력이 [5, 3, 8]이고 연산자가 *, 값이 3이라면 출력은 [15, 9, 24]가 됩니다.문제 해결 접근 방법이 문제는 다음 단계를 따라 해결할 수 있습니다.결과를 담을 새로운 리스트 res를 생성합니다.nums의 각 요소 i에 대해 다음을
문제 개요숫자로 이루어진 리스트 nums가 주어졌을 때, 모든 요소의 값을 동일하게 만들려고 합니다. 이때 사용할 수 있는 연산은 다음과 같습니다.연산 정의: 리스트에서 하나의 요소를 선택하고, 나머지 모든 요소의 값을 1씩 증가시킵니다.목표는 이 연산을 반복해서 모든 요소의 값이 같아지도록 만드는 것이며, 이때 필요한 최소 연산 횟수를 구하는 것입니다.예시입력이 [2, 4, 5]라면 출력은 5가 됩니다.핵심 아이디어이 문제의 열쇠는 연산을 상대적인 관점에서 바라보는 것입니다. 하나의 요소를 제외한 나머지를 1씩 증가시키는 연산은,