이 문제에서는 양수와 음수를 모두 포함하는 정수 배열이 주어지며, C++로 최대 곱 부분 배열(Maximum Product Subarray)을 계산하는 프로그램을 작성하는 것이 목표입니다.문제 설명배열에는 양수, 음수, 그리고 0이 섞여 있을 수 있습니다. 우리는 배열의 연속된 요소들로 만들 수 있는 부분 배열(subarray)의 곱을 계산하고, 그중 곱이 가장 커지는 부분 배열을 찾아야 합니다.예시로 이해하기입력arr[] = {-1, 2, -7, -5, 12, 6}출력5040설명최대 곱을 갖는 부분 배열은 {2, -7, -5, 1
개요이 튜토리얼에서는 C++를 사용하여 배열에서 최대 곱을 가지는 부분 집합(subset)을 찾는 프로그램을 구현하는 방법을 살펴보겠습니다.양수와 음수 값이 함께 포함된 배열이 주어졌을 때, 배열의 요소 중 일부를 선택해 만들 수 있는 부분 집합의 곱 중 최댓값을 구하는 것이 목표입니다.문제 해결 접근 방법이 문제는 배열을 한 번만 순회하면서 선형 시간 안에 해결할 수 있습니다. 핵심 규칙은 다음과 같습니다.0은 제외: 0을 곱하면 전체 곱이 0이 되므로 결과에 아무런 도움이 되지 않습니다.음수 개수가 짝수: 모든 음수를 포함해도
이 글에서는 배열 stkprice[]가 주어졌을 때, 주식을 사고팔아 얻을 수 있는 최대 이익을 C++로 계산하는 방법을 알아봅니다. 배열의 각 원소는 해당 날짜(i번째 날)의 주식 가격을 나타냅니다.문제 설명주어진 기간 동안 언제 주식을 사고 언제 팔아야 이익을 극대화할 수 있는지 찾아야 합니다. 이익을 내려면 주가가 낮을 때 사서 가격이 오른 시점에 팔면 되고, 이후 가격이 다시 하락했다면 같은 과정을 반복하면 됩니다.예시로 문제 이해하기입력stkprice[] = {120, 310, 405, 210, 150, 550}출력685설
이 문제에서는 유리수가 한 줄에 하나씩 담겨 있는 2차원 배열이 주어집니다. 우리의 과제는 C++를 사용하여 이 배열에서 최대 유리수(또는 분수)를 계산하는 프로그램을 작성하는 것입니다.문제 설명주어진 2차원 배열은 [n][2] 형태입니다. 각 행에는 두 개의 정수 값이 있으며, 이는 유리수 식 a/b에서 분자 a와 분모 b를 나타냅니다. 우리는 이 모든 유리수 중에서 가장 큰 값을 찾아야 합니다.예제로 문제 이해하기입력rat[][] = { {3, 2}, {5, 7}, {1, 9}, {11, 4} }출력
문제 소개이 문제에서는 0과 1로만 구성된 2차원 배열 arr[]와 정수 K가 주어집니다. 우리가 해야 할 일은 행렬의 행(row) 또는 열(column)을 최대 K번까지 뒤집는(flipping) 연산을 수행한 뒤, 각 행이 만들어내는 숫자들의 합이 최대가 되도록 하는 것입니다.문제 설명2차원 배열과 K번의 이동 기회가 주어졌을 때, 각 이동마다 하나의 행 또는 하나의 열을 선택하여 해당 줄의 모든 원소를 반전(0→1, 1→0)시킵니다. 선택은 K번의 뒤집기가 끝난 후 각 행이 만드는 이진수의 합이 최대가 되도록 이루어져야 하며,
이 문제에서는 정수 배열 arr[]가 주어지며, 인접한 요소를 고려하지 않고 배열에서 얻을 수 있는 최대 세트 비트(set bit) 합을 계산하는 프로그램을 C++로 작성해야 합니다. 문제 설명 주어진 배열 arr[]의 각 숫자에 대해 세트 비트(이진수 표현에서 값이 1인 비트)의 개수를 구합니다. 그다음, 서로 인접하지 않는 요소들을 선택했을 때 얻을 수 있는 세트 비트 합, 즉 a[i] + a[i+2] + ... 형태의 합 중에서 최댓값을 찾아야 합니다. 예제를 통한 문제 이해 입력 arr[] = {1, 4, 6, 7} 출력 4
이 튜토리얼에서는 주어진 조건을 만족하는 부분배열(연속된 하위 배열)의 최대 크기를 찾는 프로그램을 다룹니다.문제 정의정수로 이루어진 배열이 하나 주어집니다. 목표는 아래 두 조건 중 하나를 만족하는 가장 긴 부분배열의 길이를 구하는 것입니다.k가 홀수일 때는 arr[k] > arr[k + 1], k가 짝수일 때는 arr[k] < arr[k + 1]k가 짝수일 때는 arr[k] > arr[k + 1], k가 홀수일 때는 arr[k] < arr[k + 1]쉽게 말해, 인접한 두 요소의 대소 관계가 번갈아 뒤바뀌는
문제 개요이 튜토리얼에서는 1로만 이루어진 최대 크기의 직사각형 이진 부분행렬을 찾는 프로그램을 다룹니다.0과 1로 구성된 2차원 행렬이 주어졌을 때, 우리의 목표는 오직 1만 포함하는 가장 큰 부분행렬의 넓이를 구하는 것입니다.접근 방법이 문제는 잘 알려진 히스토그램에서 가장 큰 직사각형 알고리즘을 행 단위로 확장하면 효율적으로 해결할 수 있습니다.핵심 아이디어는 다음과 같습니다.1. 첫 번째 행을 하나의 히스토그램으로 보고 최대 직사각형 넓이를 계산합니다.2. 이후 각 행에 대해, 바로 위 행의 값에 현재 값을 더해 누적 히스토
비어 있지 않은 특수한 이진 트리가 있다고 가정해 봅시다. 이 트리의 각 노드는 음수가 아닌 값을 가지며, 자식 노드를 정확히 2개 또는 0개 가집니다. 만약 어떤 노드가 두 개의 자식을 가진다면, 그 노드의 값은 항상 두 자식 노드 값 중 더 작은 값입니다. 즉, root.val = min(root.left.val, root.right.val) 관계가 성립합니다.이러한 이진 트리가 주어졌을 때, 트리 전체 노드 값들의 집합에서 두 번째 최솟값을 찾아야 합니다. 만약 두 번째 최솟값이 존재하지 않는다면 -1을 반환하면 됩니다.예를
정수 배열이 주어졌을 때, 그중 가장 긴 연속 증가 부분 배열의 길이를 찾는 문제입니다.예를 들어 입력이 [2,4,6,5,8]이라면 출력은 3이 됩니다. 가장 긴 연속 증가 부분 수열이 [2,4,6]이고, 그 길이가 3이기 때문입니다.문제 해결 접근 방법이 문제는 배열을 한 번만 순회하면 되는 간단한 선형 탐색으로 해결할 수 있습니다. 알고리즘 단계는 다음과 같습니다.배열(nums)의 크기가 1 이하라면, 배열의 크기를 그대로 반환합니다.answer := 1, count := 1 로 초기화합니다.i := 0부터 시작하여 i가 배열
문제 개요양의 정수가 하나 주어졌을 때, 이 수가 교대 비트(alternating bits)를 가지고 있는지 확인해야 합니다. 교대 비트란 인접한 두 비트가 항상 서로 다른 값을 갖는 경우를 의미합니다.예를 들어 입력값이 10이라면 출력은 True입니다. 10의 이진 표현은 1010으로, 모든 인접 비트가 서로 다른 값을 가지기 때문입니다.해결 접근 방법이 문제는 숫자를 오른쪽으로 시프트하면서 최하위 비트를 하나씩 검사하는 방식으로 해결할 수 있습니다. 알고리즘은 다음과 같습니다.p := n AND 1 (n의 최하위 비트를 p에 저
문제 이해하기 문자열 s가 주어졌을 때, 다음 두 조건을 모두 만족하는 연속된(contiguous) 부분 문자열의 개수를 구해야 합니다. 부분 문자열 안에 포함된 0과 1의 개수가 서로 같아야 합니다. 모든 0은 한 덩어리로, 모든 1도 한 덩어리로 연속되게 배치되어 있어야 합니다. 동일한 부분 문자열이 여러 번 등장하면, 등장할 때마다 각각 따로 세어 줍니다. 예를 들어 입력이 11001100이라면 정답은 6입니다. 조건을 만족하는 부분 문자열은 1100, 10, 0011, 01, 1100, 10 입니다. 접근 방법 이 문제
문제 개요음수가 아닌 정수로만 이루어진 배열 nums가 주어졌다고 가정해 봅시다. 여기서 말하는 배열의 차수(degree)란, 배열 안에서 가장 많이 등장하는 요소의 빈도수, 즉 최대 빈도를 의미합니다. 우리가 구해야 할 것은 이 배열과 동일한 차수를 가지면서 길이가 가장 짧은 연속(contiguous) 부분 배열의 길이입니다.예를 들어 입력 배열이 [1, 2, 2, 3, 1]이라면 결과는 2가 됩니다. 이 배열에서는 1과 2가 각각 두 번씩 등장하므로 배열의 차수는 2입니다. 동일한 차수를 가지는 부분 배열로는 [1, 2, 2,
문제 소개숫자로 채워진 그리드가 주어졌을 때, 이 그리드 안에 존재하는 매직 스퀘어(Magic Square) 부분 격자의 개수를 찾아야 합니다.여기서 매직 스퀘어란 1부터 9까지의 서로 다른 숫자로 채워진 3×3 크기의 격자로, 모든 행의 합, 모든 열의 합, 그리고 두 대각선의 합이 모두 동일한 값을 가지는 정사각형을 의미합니다. 참고로 1~9를 모두 사용하면 각 줄의 합은 항상 15가 됩니다.예시입력이 아래와 같다고 가정해 보겠습니다.438495192762이 경우 출력은 1입니다. 왜냐하면 왼쪽 위 3×3 영역이 매직 스퀘어이기
정수가 적혀 있는 카드 한 벌(deck)이 있다고 가정해 보겠습니다. 확인해야 할 것은 X ≥ 2인 값을 선택했을 때, 전체 덱을 하나 이상의 그룹으로 나눌 수 있는지 여부입니다. 이때 각 그룹은 다음 조건을 만족해야 합니다.각 그룹은 정확히 X장의 카드로 구성되어야 합니다.같은 그룹에 속한 모든 카드에는 동일한 숫자가 적혀 있어야 합니다.예를 들어 입력이 deck = [1,2,3,4,4,3,2,1]이라면 출력은 true가 됩니다. [1,1], [2,2], [3,3], [4,4]처럼 같은 숫자끼리 두 장씩 묶어 나눌 수 있기 때문입
문제 개요4개의 숫자로 이루어진 배열이 주어졌을 때, 이 숫자들을 모두 사용하여 만들 수 있는 가장 큰 24시간제 시간을 찾아야 합니다. 24시간제에서 가장 작은 시간은 00:00이고, 가장 큰 시간은 23:59입니다. 자정(00:00)부터 기준으로 삼았을 때 더 많은 시간이 경과한 시간일수록 더 큰 시간으로 간주합니다. 결과는 HH:MM 형식의 길이 5짜리 문자열로 반환하며, 만들 수 있는 유효한 시간이 없다면 빈 문자열을 반환합니다.예를 들어 입력이 [1,2,3,4]라면, 만들 수 있는 가장 큰 시간은 23:41입니다.풀이 접근
이번 튜토리얼에서는 모든 학생에게 동일한 보너스 점수를 지급하되, 어떤 학생도 100점을 초과하지 않는 조건에서 합격할 수 있는 최대 학생 수를 구하는 프로그램을 다룹니다.문제의 조건은 다음과 같습니다. N명의 학생 점수가 담긴 배열이 주어지며, 각 학생에게 동일한 양의 보너스 점수를 더해야 합니다. 이때 누구도 100점을 넘을 수 없고, 합격 기준은 50점입니다. 목표는 가능한 한 많은 학생이 시험에 합격하도록 만드는 것입니다.해결 방법핵심 아이디어는 간단합니다. 가장 높은 점수를 받은 학생이 100점을 초과하지 않아야 하므로,
이 튜토리얼에서는 특정 크기의 모든 하위 배열(subarray)의 합이 k보다 작거나 같도록 만드는 최대 하위 배열 크기를 찾는 프로그램을 C++로 구현하는 방법을 다룹니다.문제 정의크기가 N인 배열과 하나의 정수 k가 주어집니다. 우리의 목표는 다음 조건을 만족하는 하위 배열의 최대 길이를 구하는 것입니다.조건: 주어진 배열에서 해당 길이를 가지는 모든 하위 배열의 합이 k 이하여야 합니다.예를 들어, 배열이 {1, 2, 10, 4}이고 k = 14라고 가정해 보겠습니다. 길이가 2인 모든 하위 배열의 합은 최대 12(2 + 10
문제 소개이 튜토리얼에서는 특정 요소를 제외한 최대 부분 배열 합(Maximum Subarray Sum Excluding Certain Elements)을 구하는 프로그램을 다룹니다.문제의 조건은 다음과 같습니다. 크기가 각각 N과 M인 두 개의 배열 A와 B가 주어집니다. 이때 배열 A에서 부분 배열(sub-array)을 찾아야 하는데, 해당 부분 배열에 포함된 어떤 요소도 배열 B에는 존재해서는 안 되며, 동시에 부분 배열의 합이 가능한 한 최대가 되어야 합니다.접근 방식이 문제는 유명한 카데인 알고리즘(Kadanes Algor
이 튜토리얼에서는 주어진 배열을 여러 번 반복하여 연결한 뒤 만들어지는 새로운 배열에서 최대 하위 배열 합계(maximum subarray sum)를 구하는 프로그램을 C++로 작성하는 방법을 알아봅니다.문제 조건은 다음과 같습니다. 길이가 n인 배열과 정수 K가 주어질 때, 원본 배열을 K번 이어 붙인 배열을 생각하고, 그 안에서 연속된 요소들의 합이 가장 커지는 하위 배열을 찾아 그 합계를 반환해야 합니다.접근 방법: 카데인 알고리즘(Kadanes Algorithm)이 문제는 유명한 카데인 알고리즘을 활용하면 간단하게 해결할 수