문자열 str[]이 입력으로 주어졌을 때, 이 문자열 안에 존재하는 아나그램(anagram) 부분 문자열의 총 개수를 구하는 것이 목표입니다. 두 문자열이 서로 아나그램 관계라는 것은, 두 문자열이 동일한 개수의 문자를 포함하며 모든 문자가 양쪽에 등장하는 경우를 말합니다. 단, 문자의 순서는 달라도 됩니다.예를 들어 abc는 cba, bca 등과 서로 아나그램 관계입니다.예제로 이해하기입력 − str[] = abccb출력 − 부분 문자열 아나그램의 총 개수: 4설명 − 아나그램 쌍은 다음과 같습니다: (b,b), (c,c), (b
문제 정의2차원 평면 위의 점들을 나타내는 두 변수 n과 m이 주어진다고 가정해 봅시다. 전체 n개의 점 중 m개의 점은 한 직선 위에 놓여 있습니다. 우리의 목표는 이 n개의 점을 이용해 만들 수 있는 삼각형의 개수를 구하는 것입니다.일직선상의 점(Collinear Points)이란 같은 직선 위에 위치한 점들을 의미합니다. 아래 그림에서 점 A와 B는 서로 일직선상에 있습니다.접근 방식: 조합 공식 활용n=4(점 A, B, C, D), m=2(점 A, B)인 경우를 예로 들어 살펴보겠습니다.4개의 점 중 임의로 3개를 선택하는
문제 소개정수 요소로 이루어진 배열 arr[]가 주어집니다. 우리의 목표는 각 부분 배열이 중복되지 않는 고유한 요소만을 포함하도록 할 때, 이러한 부분 배열의 요소들로 만들 수 있는 쌍(pair)의 총 개수를 구하는 것입니다.예를 들어 배열이 [1, 2, 2, 3, 3]이라면, 고유한 요소만 포함하는 부분 배열은 [1, 2]와 [2, 3]입니다. 여기서 만들 수 있는 쌍은 (1, 2)와 (2, 3)이므로, 쌍의 개수는 2가 됩니다.예제로 이해하기예제 1입력: arr[] = {1, 2, 5, 3}출력: 고유한 요소를 가진 부분 배열
C++에서 주어진 모든 문장에 존재하는 단어 수 세기여러 개의 문장이 문자열 형태로 주어졌을 때, 모든 문장에 공통으로 등장하는 단어의 개수를 세는 것이 이 글의 목표입니다.참고 – 소문자로만 구성된 단어만 고려 대상으로 합니다.예를 들어 다음과 같은 문장들이 있다고 가정해 보겠습니다.I am learning C languagelearning new things is easyKids are learning healthy habits세 문장 모두에 존재하는 단어는 learning 하나뿐입니다. 따라서 결과는 1이 됩니다.입출력 예시입
문제 개요하나의 수 N과 또 다른 수 L이 주어집니다. 목표는 1부터 N 사이의 숫자 중에서 그 수 자신과 각 자릿수의 합 사이의 차이가 L보다 작지 않은(즉, L 이상인) 수의 개수를 구하는 것입니다.예를 들어 N=23, L=10이라면 조건을 만족하는 수는 4개입니다.23 − (2 + 3) = 1822 − (2 + 2) = 1821 − (2 + 1) = 1820 − (2 + 0) = 18위의 네 수는 모두 조건을 만족합니다. 반면 19 − (1 + 9) = 9로 L보다 작으므로 19, 18, 17, …, 1은 조건을 만족하지 않습
원주 위에 K개의 등거리 점이 배치된 원이 하나 주어집니다. 여기에 두 점 A와 B가 추가로 주어지며, 우리의 목표는 이 점들을 활용해 내부에 둔각 ACB(90도보다 큰 각)가 존재하는 삼각형이 몇 개나 만들어질 수 있는지 세는 것입니다. 단, 두 점은 항상 A < B 조건을 만족한다고 가정합니다.예를 들어 K=8, A=2, B=5인 경우, ∠ACB와 ∠ACB가 둔각이 되도록 하는 점은 C와 C 두 개입니다.입력 및 출력 예시입력 − k=10, A=2, B=4출력 − 두 점 사이에서 만들 수 있는 둔각의 개수 − 1설명 − 둔
문제 개요 0과 1, 그리고 그 외의 문자들이 섞여 있는 문자열 str이 주어졌다고 가정해 봅시다. 이 문자열에는 “1(0+)1” 형태의 패턴이 포함되어 있으며, 여기서 0+는 하나 이상(>0)의 연속된 0을 의미합니다. 목표는 문자열 str 안에서 이러한 패턴이 총 몇 번 등장하는지 세는 것입니다. 예제로 살펴보기 예제 1 입력: str = “abb010bb10111011” 출력: 문자열에서 “1(0+)1” 패턴의 발생 횟수 − 2 설명: “abb010bb1011011” 부분에서 패턴이 두 번 발견됩니다. 예제 2 입
하나의 정수 num이 입력으로 주어졌을 때, 1부터 num 사이 범위에 있는 i와 j에 대해 ((num % i) % j) % num의 값이 최대가 되도록 만드는 (i, j) 쌍의 개수를 구하는 것이 목표입니다.문제 예시로 이해하기입력 − num = 4출력 − ((n % i) % j) % n이 최대가 되는 (i, j) 쌍의 개수: 3설명 − 해당하는 쌍은 (3,2), (3,3), (3,4)입니다.입력 − num = 6출력 − ((n % i) % j) % n이 최대가 되는 (i, j) 쌍의 개수: 4설명 − 해당하는 쌍은 (4,3),
숫자 num이 입력으로 주어졌을 때, 길이가 num이면서 모든 인접한 두 문자의 ASCII 값 차이가 정확히 1이 되는 문자열의 개수를 세는 것이 목표입니다. 예를 들어 num이 2라면 가능한 문자열은 ab, ba, bc, cb, ……, yz, zy와 같습니다. 예시로 이해하기 입력 − num=3 출력 − 인접 문자의 차이가 1인 문자열의 개수: 98 설명 − abc, aba, cde, …, xyx, zyz, xyz 등의 문자열이 조건을 만족합니다. 입력 − num=2 출력 − 인접 문자의 차이가 1인 문자열의 개수: 50 설명 −
문제 이해하기정삼각형의 한 변의 길이가 주어졌을 때, 삼각형 내부에 만들 수 있는 서로 다른 직사각형의 개수를 구하는 것이 목표입니다. 단, 직사각형의 수평 방향 변은 정삼각형의 밑변과 평행해야 하며, 직사각형의 네 꼭짓점은 모두 삼각형을 구성하는 격자점 위에 위치해야 합니다.예제를 통해 문제를 자세히 살펴보겠습니다.예제입력 − sides = 3출력 − 정삼각형에 내접하는 서로 다른 직사각형의 개수 − 1설명 − 변의 길이가 3일 때 조건을 만족하는 직사각형은 하나만 존재합니다.입력 − sides = 10출력 − 정삼각형에 내접하는
이 문제에서는 n개의 정수로 구성된 배열 arr[]가 주어집니다. 우리의 과제는 이 배열에서 삼중항(triplet, 크기 3의 부분 수열)의 최대 곱을 찾아 그 값을 반환하는 것입니다. 즉, 모든 가능한 세 원소 조합 중에서 곱이 가장 큰 조합을 찾으면 됩니다.예시를 통해 문제를 이해해 보겠습니다.입력arr[] = {9, 5, 2, 11, 7, 4}출력693설명배열의 모든 원소 중에서 가장 큰 곱을 만들어내는 삼중항을 찾습니다.maxProd = 9 * 11 * 7 = 693해결 접근 방법이 문제는 여러 가지 방법으로 해결할 수 있습
이 문제에서는 n개의 양의 정수로 구성된 배열 arr[]가 주어지며, 크기 3인 증가 부분 수열(increasing subsequence)의 최대 곱을 찾는 프로그램을 작성해야 합니다. 문제 설명 배열에서 3개의 원소를 골라 그 곱이 최대가 되도록 해야 하며, 세 원소는 값과 인덱스 모두 증가하는 순서를 이루어야 합니다. 즉, 다음 조건을 만족해야 합니다. arr[i]*arr[j]*arr[k]가 최대, arr[i]<arr[j]<arr[k]이고 i<j<k 예제로 이해하기 입력 arr = {5, 9, 2, 11,
문제 개요이 문제에서는 크기가 n인 배열 arr[]가 주어지며, 우리의 과제는 증가 부분 수열(increasing subsequence)의 곱 중 최댓값을 찾는 것입니다.문제 설명 — 배열의 원소들로 만들 수 있는 모든 길이의 증가 부분 수열 중에서, 원소들의 곱이 가장 커지는 경우의 값을 구해야 합니다.예제로 문제 이해하기입력arr[] = {5, 4, 6, 8, 7, 9}출력2160설명가능한 증가 부분 수열: {5, 6, 8, 9} → 곱 = 2160 {5, 6, 7, 9} → 곱 = 1890 여기서는 최대 길이의 부분 수열만 고
이 글에서는 배열 arr[]가 주어졌을 때, 각 원소를 기준으로 왼쪽과 오른쪽에 존재하는 다음 큰 요소(next greater element)의 인덱스를 구하고, 두 인덱스의 곱(left[i] × right[i]) 중 최댓값을 계산하는 프로그램을 작성하는 방법을 알아봅니다.문제 설명주어진 배열에 대해 left[i] × right[i] 값의 최댓값을 구해야 합니다. 두 배열은 다음과 같이 정의됩니다.left[i] = j (단, arr[i] < arr[j] 이고 i > j)right[i] = j (단, arr[i] <
이 문제에서는 n개의 정수로 이루어진 배열 arr[]가 주어지며, 우리의 목표는 배열에서 만들 수 있는 최대 곱 부분집합(Maximum Product Subset)을 찾는 프로그램을 작성하는 것입니다.문제 설명배열 요소들 중 일부를 선택해 만든 부분집합의 곱 중 가장 큰 값을 계산해야 합니다.부분집합(Subset)이란, 배열 sub[]의 모든 원소가 배열 arr[]에 포함되어 있을 때 sub[]를 arr[]의 부분집합이라고 합니다.예제로 이해하기입력arr[] = {4, 5, 2, -1, 3}출력40설명부분집합 sub[] = {4,
이 문제에서는 n개의 정수로 이루어진 배열 arr[]가 주어지며, 주어진 조건을 만족하는 부분 배열(sub-array) 중 가장 큰 크기를 구하는 프로그램을 작성해야 합니다.문제 설명아래 두 조건 중 하나를 만족하는 가장 긴 부분 배열의 길이를 찾아야 합니다.부분 배열의 모든 원소에 대해, k가 홀수이면 arr[k] > arr[k+1]이고, k가 짝수이면 arr[k] < arr[k+1]인 경우부분 배열의 모든 원소에 대해, k가 홀수이면 arr[k] < arr[k+1]이고, k가 짝수이면 arr[k] > arr
문제 개요 이 문제에서는 n×m 크기의 2차원 행렬 bin[][]가 주어지며, 행렬의 각 요소는 0 또는 1의 이진 값입니다. 우리의 목표는 모든 요소가 1로 이루어진 가장 큰 직사각형 부분행렬을 찾아 그 최대 면적을 반환하는 프로그램을 작성하는 것입니다. 예제를 통해 문제를 살펴보겠습니다. 입력 bin[][] = { {1, 0, 1, 1, 1}, {0, 1, 1, 1, 1}, {0, 0, 1, 1, 1}, {1, 1, 1, 1, 1} } 출력 12 설명 다음 직사각형 영역이 가장 넓은 면적을 가집니다.
이 문제에서는 크기가 n인 배열 stu[]가 주어지며, 이 배열에는 반 학생들의 시험 점수가 담겨 있습니다. 각 학생의 만점은 100점이며, 시험에 합격하려면 최소 50점을 받아야 합니다. 우리의 목표는 모든 학생에게 보너스 점수를 지급하되 어떤 학생의 점수도 100점을 초과하지 않도록 하면서, 합격시킬 수 있는 학생의 최대 인원수를 구하는 프로그램을 작성하는 것입니다.문제 설명학생들이 시험에 합격할 수 있도록 보너스 점수를 지급해야 하며, 여기서 중요한 조건은 보너스가 모든 학생에게 동일하게 지급되어야 한다는 점입니다. 또한 보너
이 문제에서는 0과 1로만 이루어진 n×n 크기의 2차원 행렬이 주어집니다. 우리의 목표는 1의 개수가 0의 개수보다 정확히 1개 더 많은 부분행렬(submatrix) 중에서 가장 넓은 영역의 크기를 구하는 프로그램을 작성하는 것입니다.문제 이해를 위한 예시입력bin[N][N] = { {0, 1, 0, 0}, {1, 1, 0, 0}, {1, 0, 1, 1}, {0, 1, 0, 1} }출력9설명부분행렬 : bin[1][0], bin[1][1], bin[1][2] bin[2][0], bin[2][1], bi
이번 문제에서는 하나의 이진 트리(Binary Tree)가 주어졌을 때, 그 하위 트리(subtree)가 동시에 이진 탐색 트리(BST)를 이루는 경우 중 노드 값의 합이 가장 큰 하위 트리를 찾는 프로그램을 만드는 것이 목표입니다.기본 개념 정리이진 트리는 각 노드가 최대 두 개의 자식 노드만 가질 수 있는 특수한 트리 구조입니다.이진 탐색 트리(BST)는 모든 노드가 다음 두 가지 성질을 만족하는 트리를 말합니다.왼쪽 하위 트리에 속한 모든 키 값은 부모(루트) 노드의 키 값보다 작아야 합니다.오른쪽 하위 트리에 속한 모든 키