A × B 크기의 체스판(행렬)이 주어졌을 때, 체스판이 두 부분으로 나뉘지 않도록 하면서 만들 수 있는 최대 컷(자르기) 횟수를 계산하는 것이 이번 문제의 목표입니다.예를 들어 입력이 A = 2, B = 4라고 가정해 보겠습니다.이 경우 출력은 3이 됩니다.문제 해결 접근 방법이 문제는 복잡한 알고리즘 없이 간단한 수식 하나로 해결할 수 있습니다. 핵심 아이디어는 다음과 같습니다.결괏값 res를 0으로 초기화합니다.res에 (M − 1) × (N − 1)을 대입합니다. 즉, 가로 칸 수에서 1을 뺀 값과 세로 칸 수에서 1을 뺀
문제 이해하기배구 경기의 득점 기록을 이진 문자열로 표현했다고 가정해 보겠습니다. 이때 다음 조건에 따라 경기의 최종 승자를 판별해야 합니다.기본 규칙: 두 팀이 서로 대결하며, 먼저 15점(n)에 도달한 팀이 승리합니다. 단, 양 팀 모두 14점에 도달한 경우는 예외입니다.듀스 규칙: 양 팀이 모두 14점에 도달한 상황에서는 이후 2점 차이를 먼저 만들어내는 팀이 승자가 됩니다.주어진 이진 문자열에서 0은 우리 팀이 실점한 것(즉, 상대 팀의 득점), 1은 우리 팀이 득점한 것을 의미합니다. 문자열을 끝까지 읽으며 우리 팀이 최종
문제 소개정점이 b개, 간선이 a개인 무방향 그래프(undirected graph)가 주어졌을 때, 이 그래프가 오일러 회로(Euler Circuit)를 가지도록 만들기 위해 추가해야 하는 최소 간선 수를 구하는 것이 목표입니다.예를 들어 다음과 같은 그래프가 입력으로 주어지면,출력 결과는 1이 됩니다.오일러 회로의 조건오일러 회로란 그래프의 모든 간선을 정확히 한 번씩 통과하면서 다시 시작점으로 돌아오는 닫힌 경로입니다. 무방향 그래프에서 오일러 회로가 존재하려면 다음 조건을 만족해야 합니다.그래프가 연결되어 있어야 합니다.모든
문제 설명세 개의 배열 A, B, C와 목표값 "sum"이 주어졌을 때, 각각 서로 다른 배열에서 가져온 세 요소 a, b, c가 존재하여 a + b + c = sum을 만족하는지 확인해야 합니다.예를 들어, 입력이 다음과 같다고 가정해 보겠습니다.A = [2, 3, 4, 5, 6]B = [3, 4, 7, 2, 3]C = [4, 3, 5, 6, 7]sum = 12이 경우 출력은 True가 됩니다. 왜냐하면 4 + 2 + 6 = 12를 만족하며, 4는 배열 A에서, 2는 배열 B에서, 6은 배열 C에서 각각 가져올
N개의 숫자로 이루어진 배열이 주어졌을 때, 남은 숫자들의 최대공약수(GCD)가 처음 전체 배열의 GCD보다 커지도록 제거해야 하는 원소의 최소 개수를 구하는 문제를 살펴보겠습니다.문제 이해하기예를 들어 입력이 [6, 9, 15, 30]이라고 가정해 봅시다. 네 숫자의 초기 GCD는 3입니다. 여기서 6과 9를 제거하면 남은 숫자는 15와 30이 되고, 이때의 GCD는 15가 됩니다. 15 > 3이므로 필요한 최소 제거 횟수는 2입니다.접근 방법핵심 아이디어는 다음과 같습니다.전체 배열의 GCD를 g라고 할 때, 각 원소를 g
문제 소개정수 n개로 이루어진 배열 arr가 주어졌을 때, arr[i]Carr[j] 값(조합)이 최대가 되도록 두 원소 arr[i]와 arr[j]를 찾아야 합니다. 만약 조건을 만족하는 쌍이 여러 개 존재한다면, 그중 아무거나 하나만 반환하면 됩니다.예를 들어 입력 배열이 [4, 1, 2]라고 해보겠습니다. 4C1 = 4, 4C2 = 6, 2C1 = 2이므로 가능한 모든 쌍 중 (4, 2)가 가장 큰 조합 값을 가집니다. 따라서 출력은 4 2가 됩니다.해결 접근 방식조합 C(n, r)의 수학적 성질을 활용하면 문제를 효율적으로 풀
문제 소개 이진 트리(Binary Tree)가 주어졌을 때, 그 안에서 가장 큰 완전 서브트리(Complete Subtree)의 크기를 구하는 것이 이번 글의 목표입니다. 여기서 완전 이진 트리란 마지막 레벨을 제외한 모든 레벨이 노드로 가득 차 있고, 마지막 레벨의 노드들은 가능한 한 왼쪽에 치우쳐 배치된 이진 트리를 의미합니다. 예를 들어 다음과 같은 이진 트리가 입력으로 주어진다고 가정해 보겠습니다. 이 경우 정답은 크기 4이며, 해당 서브트리의 중위 순회(inorder traversal) 결과는 10, 45, 60, 70입
어떤 숫자 N이 주어졌을 때, N에서 최소한의 자릿수(0개일 수도 있음)를 삭제하여 만들 수 있는 가장 큰 완전세제곱수(perfect cube)를 구하는 문제입니다. 주어진 숫자에서 어떤 자릿수든 자유롭게 삭제할 수 있습니다.여기서 완전세제곱수란 어떤 정수 M에 대해 N = M³이 성립하는 수를 의미합니다.예를 들어 입력이 806이라면 출력은 8입니다. 숫자 806에서 0과 6을 삭제하면 8만 남는데, 이는 2³ = 8로 완전세제곱수이기 때문입니다.문제 해결 접근 방식이 문제는 다음 두 단계로 나누어 해결할 수 있습니다.1단계: 사
프로그래밍 문제에서 자주 등장하는 과제 중 하나는 문자열에 포함된 괄호가 균형 잡혀 있는지 확인하는 것입니다. 이번 글에서는 추가 메모리를 거의 사용하지 않는 O(1) 공간 복잡도와 O(N²) 시간 복잡도로 이 문제를 해결하는 파이썬 방법을 살펴보겠습니다.문제 정의여섯 종류의 괄호 문자인 (, ), {, }, [, ]로 구성된 문자열 str이 주어졌을 때, 이 괄호들이 균형 잡혀 있는지 판별해야 합니다. 균형 잡힌 괄호란 다음 조건을 만족하는 경우를 말합니다.여는 괄호와 닫는 괄호의 종류가 서로 일치해야 합니다.괄호가 올바른 순서로
레드-블랙 트리의 높이 균형 조건 레드-블랙 트리(Red-Black Tree)와 같은 자가 균형 트리에서는 임의의 노드가 가질 수 있는 최대 높이가 최소 높이의 두 배를 넘지 않습니다. 이러한 특성 덕분에 트리의 탐색·삽입·삭제 연산이 항상 O(log n)의 시간 복잡도를 유지할 수 있습니다. 따라서 하나의 이진 탐색 트리(Binary Search Tree)가 주어졌을 때, 그 트리가 높이 균형을 이루고 있는지 확인하려면 다음 성질을 검사해야 합니다. 모든 노드에 대해, 그 노드에서 가장 깊은 리프까지의 경로(최장 경로)에 있는 노
문제 이해하기이진 트리가 하나 주어졌을 때, 해당 트리가 힙(Heap)인지 아닌지를 판별해야 합니다. 힙이 되기 위해서는 다음과 같은 조건을 만족해야 합니다.트리는 완전 이진 트리(Complete Binary Tree)여야 합니다. 즉, 마지막 레벨을 제외한 모든 레벨이 꽉 차 있어야 합니다.모든 노드의 값은 자식 노드의 값보다 크거나 같아야 합니다. 이를 최대 힙(Max-Heap) 속성이라고 합니다.예를 들어 다음과 같은 트리가 입력으로 주어지면, 출력은 True가 됩니다.해결 접근 방법이 문제는 세 가지 보조 함수를 재귀적으로
프로그래밍을 하다 보면 숫자와 소수점으로 구성된 문자열이 실제로 유효한 숫자를 나타내는지 판별해야 하는 경우가 자주 있습니다. 예를 들어 입력값이 2.5라면 결과는 True여야 하고, xyz처럼 숫자가 아닌 문자열이라면 False를 반환해야 합니다.문제 해결 접근 방식이 문제는 파이썬의 문자열 파싱(string parsing) 기법을 활용하면 간단하게 해결할 수 있습니다.핵심 아이디어는 다음과 같습니다.문자열을 숫자 타입으로 변환을 시도합니다.변환 과정에서 예외(exception)가 발생하지 않으면 해당 문자열은 유효한 숫자입니다.
배열 A에 N개의 요소가 있고, 찾고자 하는 값 p와 구간(segment)의 크기 k가 주어졌을 때, 배열 A를 크기 k로 나눈 모든 구간 안에 값 p가 존재하는지 확인해야 하는 문제입니다.예를 들어, 입력이 다음과 같다고 가정해 보겠습니다.A = [4, 6, 3, 5, 10, 4, 2, 8, 4, 12, 13, 4]p = 4 (찾을 키)k = 3 (구간 크기)배열을 크기 3씩 나누면 [4, 6, 3], [5, 10, 4], [2, 8, 4], [12, 13, 4] 네 개의 구간이 되고, 각 구간마다 4가 모두 포함되어 있으므로 출
문제 개요 무한히 넓은 체스판이 하나 있다고 가정해 보겠습니다. 이 체스판은 일반 체스와 동일한 규칙을 따르며, 좌표 범위가 매우 넓어 -10⁹ ≤ x, y ≤ 10⁹로 주어집니다. 체스판 위에는 N개의 나이트(말)가 배치되어 있고, 킹의 좌표도 함께 주어집니다. 우리가 확인해야 할 것은 바로 이 킹이 체크메이트 상태인지, 즉 더 이상 유효한 수를 둘 수 없는지 여부입니다. 예를 들어 나이트의 위치가 [[2,1],[1,3],[3,6],[5,5],[6,1],[7,3]]이고 킹의 위치가 [4,3]이라고 해 보겠습니다. 이 경우 출력은
트로이 수(Trojan Number)란?어떤 수 n이 주어졌을 때, 이 수가 트로이 수(Trojan Number)인지 확인하는 문제를 살펴보겠습니다. 트로이 수란 완전 거듭제곱(perfect power)이 아닌 강한 수(strong number)를 의미합니다.여기서 강한 수란, n의 모든 소인수 p에 대해 p² 역시 n의 약수가 되는 수를 말합니다. 다시 말해, 모든 소인수가 최소 두 번 이상 나타나야 한다는 뜻입니다. 모든 트로이 수는 강한 수이지만, 그 역은 성립하지 않습니다. 즉, 모든 강한 수가 트로이 수는 아니며, ab 형
어떤 수 n이 주어졌을 때, n이 아킬레스 수(Achilles number)인지 판별해야 합니다. 아킬레스 수란 강력수(powerful number)이면서 동시에 완전거듭제곱(perfect power)은 아닌 수를 말합니다. 여기서 강력수란 모든 소인수 p에 대해 p² 역시 그 수를 나누는 수를 의미합니다. 아킬레스 수의 대표적인 예로는 72, 108, 200, 288, 392, 432, 500, 648, 675, 800, 864, 968, 972, 1125 등이 있습니다. 예를 들어 입력이 108이라면 결과는 True입니다. 6과
어떤 수 n이 주어졌을 때, 이 수가 프라이모리얼 소수(Primorial Prime)인지 판별해야 합니다. 프라이모리얼 소수란 pN# + 1 또는 pN# − 1 형태를 가지는 소수를 말합니다. 여기서 pN#은 프라이모리얼(primorial)을 의미하며, 처음 N개의 소수들을 모두 곱한 값입니다.예를 들어 입력값이 29라면 결과는 True가 됩니다. N=3일 때 프라이모리얼은 2 × 3 × 5 = 30이고, 30 − 1 = 29이므로 29는 pN# − 1 형태의 프라이모리얼 소수에 해당하기 때문입니다.해결 접근 방법이 문제는 다음 단
C++ STL 힙(Heap)이란? C++ STL은 컨테이너를 힙 구조로 손쉽게 변환하고 관리할 수 있는 함수들을 제공합니다. 힙을 활용하면 데이터를 빠르게 삽입할 수 있고, 요소를 꺼낼 때마다 남아 있는 값 중 항상 가장 큰 값이 반환됩니다. 나머지 요소들의 배치는 내부 구현 방식에 따라 달라질 수 있습니다. 1. make_heap()과 front() make_heap() – 반복자로 지정한 범위를 힙 구조로 변환합니다. front() – 힙의 첫 번째 요소, 즉 최댓값을 반환합니다. 예제 코드 #include <bits
이진 탐색 트리(Binary Search Tree)의 후위 순회(postorder) 시퀀스가 주어졌을 때, 이를 기반으로 원래의 트리를 복원하는 방법을 알아보겠습니다. 예를 들어 후위 순회 결과가 [9,15,7,20,3]이라면 다음과 같은 트리가 생성됩니다.핵심 아이디어일반적인 이진 트리를 복원하려면 보통 전위(preorder) 또는 후위(postorder) 순회와 함께 중위 순회(inorder) 결과가 필요합니다. 하지만 이진 탐색 트리는 특별한 성질을 가지고 있습니다.이진 탐색 트리의 중위 순회 결과는 항상 오름차순으로 정렬된
이진 트리의 중위 순회(inorder)와 후위 순회(postorder) 결과가 주어졌을 때, 이 두 시퀀스만으로 원래의 트리를 복원할 수 있습니다.예를 들어 후위 순회가 [9, 15, 7, 20, 3]이고 중위 순회가 [9, 3, 15, 20, 7]이라면, 다음과 같은 이진 트리가 생성됩니다.핵심 아이디어후위 순회는 왼쪽 → 오른쪽 → 루트 순서로 노드를 방문하므로, 리스트의 마지막 값이 항상 루트입니다. 또한 중위 순회는 왼쪽 → 루트 → 오른쪽 순서이므로, 루트 값을 기준으로 중위 순회 리스트를 나누면 왼쪽 서브트리와 오른쪽 서