개요이 튜토리얼에서는 주어진 숫자 n에 대해 비트 OR(bitwise OR) 연산의 결과가 n과 같아지는 가장 큰 집합을 찾는 프로그램을 작성해 보겠습니다.여기서 가장 큰 집합이란 0부터 n 사이의 숫자 중, 각 숫자 i와 n을 비트 OR 연산했을 때 결과가 n이 되는 모든 숫자들을 모은 집합을 의미합니다.문제 해결 접근 방법문제를 해결하는 단계는 다음과 같습니다.숫자 n을 초기화합니다.0부터 n까지 반복하는 루프를 작성합니다.i | n의 결과가 n과 같다면 i를 결과 집합에 추가합니다.완성된 결과 집합을 반환합니다.동작 원리비트
이 튜토리얼에서는 주어진 숫자 n보다 작으면서, 단 한 번의 자리 교환(swap) 연산만으로 만들 수 있는 가장 큰 숫자를 찾는 프로그램을 C++로 작성해 보겠습니다.문제 해결 접근 방법핵심 아이디어는 숫자를 오른쪽에서 왼쪽으로 훑어보며 처음으로 자릿수가 감소하는 지점을 찾는 것입니다. 이 지점의 자릿수를 오른쪽 구간에 있는 적절한 자릿수와 교환하면, 원래 숫자보다 작으면서도 가능한 한 큰 값을 얻을 수 있습니다.단계별로 살펴보면 다음과 같습니다.숫자 n을 문자열 형태로 초기화합니다.문자열 끝에서부터 앞쪽으로 탐색하면서, 현재 자릿
개요이 튜토리얼에서는 C++를 사용하여 합이 k보다 큰 가장 긴 부분 배열(subarray)의 길이를 찾는 프로그램을 작성해 보겠습니다. 배열에 음수가 포함될 수 있기 때문에 단순한 투 포인터 기법으로는 해결할 수 없으며, 누적 합(prefix sum)과 이진 탐색(binary search)을 함께 활용하는 것이 핵심 아이디어입니다.문제 해결 접근 방법전체적인 풀이 과정은 다음과 같습니다.배열을 초기화합니다.배열을 순회하면서 각 인덱스까지의 누적 합과 해당 인덱스를 pair 형태로 벡터에 저장합니다.저장된 누적 합들을 합 값과 인덱
0과 1이 섞여 있는 배열에서 두 숫자의 개수가 동일한 가장 긴 연속 부분 배열을 찾는 문제는 코딩 테스트와 알고리즘 학습에서 자주 등장하는 유형입니다. 단순히 모든 구간을 확인하는 브루트 포스 방식은 O(n²) 이상의 시간이 걸리지만, 누적 합(Prefix Sum)과 해시 맵을 활용하면 O(n) 시간 복잡도로 효율적으로 해결할 수 있습니다.핵심 아이디어이 문제의 핵심은 다음과 같습니다.배열의 모든 0을 -1로 변환하면, 0과 1의 개수가 같은 구간의 합은 반드시 0이 됩니다.따라서 누적 합이 같은 두 지점 사이의 구간은 항상 합이
문제 소개정수 배열이 주어졌을 때, 최소 k개 이상의 연속된 원소를 포함하는 부분 배열(subarray) 중에서 합이 가장 큰 값을 찾는 것이 이번 튜토리얼의 목표입니다. 단순한 슬라이딩 윈도우만으로는 k개 미만의 경우를 배제하기 어렵기 때문에, 카데인 알고리즘(Kadanes Algorithm)과 슬라이딩 윈도우 기법을 함께 활용하면 O(n) 시간 복잡도로 효율적으로 해결할 수 있습니다.알고리즘 단계프로그램을 완성하기 위한 단계는 다음과 같습니다.배열을 초기화합니다.크기가 n인 max_sum 배열을 초기화합니다.카데인 알고리즘을 이
개요OpenCV에서 컬러 이미지를 다룰 때 가장 기본적인 작업 중 하나는 특정 픽셀의 채널 값을 읽어오는 것입니다. 이 글에서는 C++를 사용하여 BGR 3채널 이미지에서 파랑·초록·빨강 각 채널의 픽셀 값을 읽고 콘솔 창에 출력하는 방법을 단계별로 살펴봅니다.핵심 문법: at<Vec3b>먼저 픽셀 값을 저장할 세 개의 변수인 blue_Channel, green_Channel, red_Channel을 선언합니다. 이 변수들은 반복문(for loop) 안에서 각 채널의 픽셀 값을 담는 역할을 하며, 이미지를 불러올 행렬(m
이미지에서 특정 부분을 분리하려면 먼저 해당 영역의 위치를 파악해야 합니다. 이후 원본 이미지에서 그 영역을 복사해 별도의 행렬(Matrix)에 저장하게 되는데, 이것이 바로 OpenCV에서 ROI(Region of Interest, 관심 영역)가 동작하는 방식입니다.ROI 추출의 기본 원리이번 예제에서는 가장 먼저 두 개의 행렬을 선언합니다. 그다음 image_name.jpg라는 이미지를 image1 행렬에 불러옵니다. 여기서 주목해야 할 코드가 바로 다음 줄입니다.image2 = image1(Rect(100, 100, 120,
라틴 방진(Latin Square)은 각 행과 열에 같은 숫자가 정확히 한 번씩만 등장하는 특수한 패턴의 행렬입니다. 다양한 예시를 통해 이 패턴을 자세히 살펴보겠습니다.1 2 2 1 1 2 3 3 1 2 2 3 1 1 2 3 4 4 1 2 3 3 4 1 2 2 3 4 1위 예시에서 볼 수 있듯이 라틴 방진은 크기가 다양합니다. 하지만 이 행렬들의 패턴을 잘 관찰해 보면 한 가지 공통된 규칙을 발견할 수 있습니다. 바로 이전 행의 마지막 숫자가 다음 행의 첫 번째 요소로 이동한다는 것입니다.이것이 바로 라틴 방진에 숨겨진 핵심
숫자 N과 M개의 숫자로 이루어진 배열이 주어졌을 때, 주어진 숫자들을 조합하여 만들 수 있는 N자리 수 중에서 5로 나누어 떨어지는 수의 개수를 구하는 것이 이번 문제의 목표입니다.문제 이해하기예시를 통해 문제의 입력과 출력을 먼저 살펴보겠습니다.입력 −N = 2 M = 3 arr = {5, 6, 3}출력 −2주어진 배열의 숫자들로 만들 수 있는 2자리 수 중에서는 35와 65, 두 개의 수가 5로 나누어 떨어집니다.다른 예시도 확인해 보겠습니다.입력 −N = 1 M = 7 arr = {2, 3, 4, 5, 6, 7, 8}출력 −
세 개의 숫자가 주어졌을 때, 앞의 두 숫자가 가진 배수들을 모두 모아 정렬한 목록에서 n번째 배수를 찾는 문제입니다. 예시를 통해 좀 더 자세히 살펴보겠습니다. 예제 이해하기 입력 x = 2 y = 3 n = 7 출력 10 2의 처음 n개 배수는 2, 4, 6, 8, 10, 12, 14이고, 3의 처음 n개 배수는 3, 6, 9, 12, 15, 18, 21입니다. 두 목록을 하나로 합치고 중복을 제거한 뒤 오름차순으로 정렬하면 2, 3, 4, 6, 8, 9, 10, 12, 14, 15, 18, 21이 됩니다. 이 목록에서 n번째(
자릿수의 합이 10이 되는 수들을 나열하면 다음과 같습니다.19, 28, 37, 46, 55, 64, 73, 82, 91, ...이 수열을 자세히 관찰해 보면 각 수가 9씩 증가한다는 규칙을 발견할 수 있습니다. 물론 9씩 증가하는 과정에서 자릿수의 합이 10이 아닌 수도 등장하지만(예: 91 다음의 100은 자릿수의 합이 1), 그렇다 하더라도 자릿수의 합이 10인 모든 수는 이 탐색 과정에서 반드시 만나게 됩니다.그 이유는 수학적으로도 설명할 수 있습니다. 어떤 수의 자릿수 합이 10이라면, 그 수를 9로 나눈 나머지는 항상 1
{0, 1, 2, 3, 4, 5}의 숫자만 사용해 만들 수 있는 수는 아래와 같습니다.0, 1, 2, 3, 4, 5, 10, 11, 12, 13, 14, 15, 20, 21, 22, 23, 24, 25, ...이 수열은 처음 여섯 개의 숫자(0~5)를 바탕으로 일정한 규칙에 따라 차례대로 생성할 수 있습니다. 숫자가 만들어지는 과정을 예시로 살펴보겠습니다. 1 * 10 + 0 = 10 1 * 10 + 1 = 11 1 * 10 + 2 = 12 1 * 10 + 3 = 13 1 * 10 + 4 = 14 1 * 10 + 5 = 15숫자 1
폴라이트 수란?폴라이트 수(polite number)는 2개 이상의 연속된 양의 정수의 합으로 표현할 수 있는 양수를 말합니다. 예를 들어, 5 = 2 + 3처럼 연속된 자연수의 덧셈으로 나타낼 수 있습니다.폴라이트 수열은 다음과 같습니다.3, 5, 6, 7, 9, 10, 11, 12, 13, 14...참고로 2의 거듭제곱(1, 2, 4, 8, ...)은 연속된 정수의 합으로 표현할 수 없기 때문에 폴라이트 수에 포함되지 않습니다.N번째 폴라이트 수를 구하는 공식N번째 폴라이트 수는 아래 공식을 통해 바로 계산할 수 있습니다.n +
문제 개요N제곱근의 차수 N과 그 계산 결과가 주어졌을 때, numberN = result를 만족하는 숫자를 찾는 것이 목표입니다.예시를 통해 문제를 이해해 보겠습니다.예제 1입력result = 25 N = 2출력552 = 25이므로, 위 예제의 정답은 5입니다.예제 2입력result = 64 N = 3출력443 = 64이므로, 위 예제의 정답은 4입니다.알고리즘가장 직관적인 해결 방법은 완전 탐색(Brute Force)입니다. 1부터 시작하여 숫자를 하나씩 늘려가며 해당 숫자의 N제곱이 result와 일치하는지 확인합니다.탐색 변
이 글에서 다룰 수열은 2, 12, 36, 80, 150...입니다.수열을 자세히 살펴보면 흥미로운 패턴을 발견할 수 있습니다. 각 항은 n2 + n3, 즉 제곱과 세제곱의 합으로 표현됩니다.n = 1일 때: 1 + 1 = 2n = 2일 때: 4 + 8 = 12n = 3일 때: 9 + 27 = 36n = 4일 때: 16 + 64 = 80n = 5일 때: 25 + 125 = 150따라서 이 수열의 일반항은 다음과 같이 정의할 수 있습니다.T(n) = n2 + n3알고리즘n번째 항을 구하는 절차는 다음과 같습니다.구하고자 하는 항의 번
주어진 수열은 1, 11, 55, 239, 991, …입니다.이 수열을 자세히 살펴보면 각 항이 일정한 규칙에 따라 증가하고 있음을 확인할 수 있습니다. 분석 결과, n번째 항은 다음과 같은 공식으로 나타낼 수 있습니다.a(n) = 4n − 2n − 1공식을 검증해 보면 다음과 같습니다.n = 1 → 4¹ − 2¹ − 1 = 4 − 2 − 1 = 1n = 2 → 4² − 2² − 1 = 16 − 4 − 1 = 11n = 3 → 4³ − 2³ − 1 = 64 − 8 − 1 = 55n = 4 → 4⁴ − 2⁴ − 1 = 256 − 16
문제 이해하기주어진 수열은 1, 17, 98, 354...입니다.이 수열을 자세히 관찰해 보면, n번째 항이 각 자연수의 4제곱 값들을 차례대로 더한 누적 합과 같다는 규칙을 발견할 수 있습니다.패턴을 직접 확인해 보겠습니다.1 = 1 ^ 417 = 1 ^ 4 + 2 ^ 498 = 1 ^ 4 + 2 ^ 4 + 3 ^ 4354 = 1 ^ 4 + 2 ^ 4 + 3 ^ 4 + 4 ^ 4...알고리즘숫자 N을 초기화합니다.결과값을 0으로 초기화합니다.1부터 n까지 반복하는 루프를 작성합니다.현재 숫자의 4제곱 값을 결과에 더합니다.최종 결
K자리 회문 중 N번째 회문을 찾는 문제는 코딩 테스트나 알고리즘 학습에서 자주 등장하는 주제입니다. 이 글에서는 비효율적인 방법과 효율적인 방법을 비교하고, C++로 구현하는 과정까지 자세히 살펴보겠습니다.비효율적인 접근 방식가장 단순하게 떠올릴 수 있는 방법은 가장 작은 K자리 수부터 시작하여 한 숫자씩 증가시키면서 회문인지 검사하고, N번째 회문을 발견할 때까지 반복하는 것입니다. 하지만 이 방법은 회문이 아닌 수까지 모두 확인해야 하므로 탐색 범위가 매우 넓어져 비효율적입니다. 직접 구현해 보면 그 차이를 체감할 수 있습니다
이 튜토리얼에서는 n번째 오각형 수(pentagonal number)를 구하는 프로그램을 C++로 작성해 보겠습니다.오각형 수란?오각형 수는 점이나 조약돌을 정오각형 모양으로 배열했을 때 표현되는 수를 의미합니다. 오각형 수는 다각형 수(polygonal number)의 한 종류로, 각 단계마다 새로운 층이 바깥쪽으로 추가되는 형태로 늘어납니다. 시각적인 이해를 돕기 위해 위키백과의 다각형 수 문서를 참고하는 것도 좋습니다.n번째 오각형 수는 다음 공식으로 계산할 수 있습니다.P(n) = (3 × n² − n) / 2오각형 수열은
스마트 넘버(Smart Number)란? 스마트 넘버는 서로 다른 소인수(prime factor)를 최소 3개 이상 가진 수를 의미합니다. 예를 들어 30은 2 × 3 × 5로 표현되므로 세 개의 서로 다른 소인수를 가지며, 스마트 넘버에 해당합니다. 숫자 N이 주어졌을 때 N번째 스마트 넘버를 찾는 것이 이 문제의 목표입니다. 스마트 넘버 수열은 다음과 같습니다. 30, 42, 60, 66, 70, 78 ... 30 = 2 × 3 × 5 42 = 2 × 3 × 7 60 = 2² × 3 × 5 (중복된 소인수는 하나로 계산) 알