정사각형의 한 변의 길이가 주어졌을 때, 그 정사각형의 넓이를 계산하여 출력하는 것이 이 프로그램의 목표입니다.정사각형이란?정사각형은 2차원 평면 도형으로, 4개의 변과 4개의 직각(90도) 각을 가지며 모든 변의 길이가 서로 같습니다. 다르게 표현하면, 정사각형은 네 변의 길이가 모두 동일한 특수한 형태의 직사각형이라고 할 수 있습니다.아래는 정사각형의 시각적 표현입니다.정사각형 넓이 공식정사각형의 넓이는 다음 공식으로 계산할 수 있습니다.넓이 = 한 변의 길이 × 한 변의 길이예제입력: 6 출력: 36 한 변의 길이가 6이므로
이번 글에서는 배열을 세트 비트(set bit) 개수를 기준으로 정렬하는 흥미로운 문제를 다뤄보겠습니다. 세트 비트란 숫자를 이진수로 표현했을 때 값이 1인 비트의 개수를 의미합니다. 규칙은 간단합니다. 세트 비트가 더 많은 요소일수록 세트 비트가 적은 요소보다 앞쪽에 배치됩니다.예를 들어 숫자 12, 15, 7의 이진 표현은 각각 1100, 1111, 0111이며, 세트 비트 개수는 순서대로 2개, 4개, 3개입니다. 따라서 정렬 후 결과는 다음과 같습니다.1111, 0111, 1100 (15, 7, 12)문제 해결 접근 방식정렬
이번 글에서는 또 다른 형태의 정렬 문제를 살펴보겠습니다. 두 개의 배열 A1과 A2가 있다고 가정해 봅시다. 우리는 A1을 정렬하되, 요소들 간의 상대적인 순서가 A2에 나타난 순서와 동일하도록 만들어야 합니다. 그리고 A2에 존재하지 않는 요소들은 정렬된 요소들 뒤에 추가됩니다.예를 들어 A1과 A2가 다음과 같다고 해보겠습니다.A1 = {2, 1, 2, 1, 7, 5, 9, 3, 8, 6, 8} A2 = {2, 1, 8, 3}정렬 후 A1은 아래와 같이 변합니다.A1 = {2, 2, 1, 1, 8, 8, 3, 5, 6, 7,
이 글에서는 문자열 목록을 길이를 기준으로 정렬하는 방법을 알아보겠습니다. 즉, 문자 수가 적은 문자열일수록 앞쪽에 배치되고, 더 긴 문자열들은 그 뒤에 배치됩니다.예를 들어 다음과 같은 문자열 배열이 있다고 가정해 보겠습니다.str_list = {Hello, ABC, Programming, Length, Population}정렬 후에는 다음과 같이 변경됩니다.str_list = {ABC, Hello, Length, Population, Programming}정렬 원리C++ STL의 sort() 함수는 기본적으로 사전순(알파벳 순)
이 글에서는 각 숫자의 자릿수 합을 기준으로 배열을 정렬하는 방법을 알아봅니다. 자릿수의 합이 작은 숫자가 앞에 오고, 합이 큰 숫자일수록 뒤에 배치됩니다.문제 이해하기예를 들어 다음과 같은 데이터가 있다고 가정해 보겠습니다.data = {14, 129, 501, 23, 0, 145}각 숫자의 자릿수 합은 다음과 같습니다.0 → 014 → 1 + 4 = 523 → 2 + 3 = 5501 → 5 + 0 + 1 = 6145 → 1 + 4 + 5 = 10129 → 1 + 2 + 9 = 12따라서 자릿수 합을 기준으로 정렬하면 결과는 다음
이번 글에서는 C++를 이용해 테트라나치(Tetranacci) 수열을 생성하는 방법을 알아보겠습니다. 테트라나치 수열은 피보나치(Fibonacci) 수열과 유사하지만, 차이점이 있다면 새로운 항을 만들 때 이전 두 항이 아닌 이전 네 개의 항을 모두 더한다는 점입니다.예를 들어 n번째 항 T(n)을 구하고 싶다면 다음과 같은 점화식을 사용합니다.T(n) = T(n - 1) + T(n - 2) + T(n - 3) + T(n - 4)수열은 초기값 {0, 1, 1, 2}에서 시작합니다.알고리즘테트라나치 수열을 생성하는 알고리즘은 매우 간
이번 글에서는 C++를 이용해 트리보나치(Tribonacci) 수열을 생성하는 방법을 알아보겠습니다. 트리보나치 수는 피보나치 수와 매우 유사하지만, 차이점은 새로운 항을 만들 때 이전 세 개의 항을 더한다는 점입니다.n번째 항 T(n)을 구하는 공식은 다음과 같습니다.T(n) = T(n - 1) + T(n - 2) + T(n - 3)수열은 첫 세 항 {0, 1, 1}에서 시작합니다.알고리즘트리보나치 수열을 생성하는 절차는 다음과 같습니다.tribonacci(n): 시작 first := 0, second := 1, third
트리보나치 워드(Tribonacci Word)는 숫자들로 이루어진 특수한 수열입니다. 이름에서 알 수 있듯이 피보나치 워드(Fibonacci Word)와 매우 유사하지만, 차이점은 두 개가 아닌 세 개의 이전 문자열을 반복적으로 연결하여 새로운 문자열을 만든다는 점입니다.수열의 점화식은 다음과 같습니다.T(n) = T(n - 1) + T(n - 2) + T(n - 3)시작 문자열은 {1, 12, 1213}이며, 그다음 문자열은 앞의 세 문자열을 연결한 1213 + 12 + 1 = 1213121이 됩니다.알고리즘트리보나치 워드를 생성
행렬 사슬 곱셈(Matrix Chain Multiplication, MCM)은 여러 개의 행렬이 주어졌을 때, 곱셈 연산 횟수를 최소화하는 최적의 곱셈 순서를 찾는 고전적인 동적 계획법(Dynamic Programming) 문제입니다.문제의 핵심: 결합 법칙과 곱셈 순서행렬 곱셈은 결합 법칙(associative law)이 성립합니다. 즉, 네 개의 행렬 A, B, C, D가 있을 때 A(BCD), (AB)(CD), (ABC)D 등 어떤 방식으로 묶어도 결과 행렬은 같습니다.하지만 중요한 점은, 묶는 순서에 따라 필요한 스칼라 곱셈
쌍(pair)들로 이루어진 사슬(chain)이 주어집니다. 각 쌍은 두 개의 정수를 가지며, 항상 첫 번째 정수가 두 번째 정수보다 작습니다. 사슬을 구성할 때도 동일한 규칙이 적용되며, 쌍 (x, y)를 쌍 (p, q) 뒤에 연결하려면 q < x라는 조건을 반드시 만족해야 합니다.이 문제를 해결하려면 먼저 주어진 쌍들을 첫 번째 원소를 기준으로 오름차순으로 정렬합니다. 그런 다음 각 쌍의 두 번째 원소와 그다음 쌍의 첫 번째 원소를 비교하여 연결 가능 여부를 판단합니다.문제 예시입력 − 숫자 쌍의 사슬: {(5, 24), (
문제 개요 양수와 음수가 저장된 배열이 있다고 가정해 봅시다. 이 배열은 거리의 한쪽 끝에서 반대쪽 끝까지 이어지는 체크포인트를 나타내며, 각 값은 해당 지점에서 변화하는 에너지의 양을 의미합니다. 양수는 에너지를 증가시키고, 음수는 에너지를 감소시킵니다. 우리의 목표는 이동 과정 전체에서 에너지 수준이 단 한 번도 0이 되거나 0 미만으로 떨어지지 않도록 하는 최소 초기 에너지 값을 구하는 것입니다. 예를 들어 배열 A = {4, -6, 2, 3}이 있고 초기 에너지가 0이라고 가정해 보겠습니다. 첫 번째 체크포인트에 도착하면
이번 글에서는 흥미로운 알고리즘 문제를 하나 살펴보겠습니다. N개의 원소를 가진 배열이 주어졌을 때, 이 배열을 서로소(co-prime) 배열로 만들기 위해 필요한 최소 삽입 횟수를 구하는 것이 목표입니다. 여기서 서로소 배열이란, 인접한 두 원소의 최대공약수(GCD)가 항상 1이 되는 배열을 의미합니다. 계산 결과뿐만 아니라 완성된 배열도 함께 출력해야 합니다.문제 이해하기예를 들어 {5, 10, 20}이라는 배열을 생각해 봅시다. gcd(5, 10) = 5, gcd(10, 20) = 10이므로 이 배열은 서로소 배열이 아닙니다.
개요 이 글에서는 주어진 GCD(최대공약수)와 LCM(최소공배수) 값을 동시에 만족하는 숫자 쌍의 개수를 구하는 방법을 살펴봅니다. 예를 들어 GCD가 2이고 LCM이 12라고 가정해 보겠습니다. 이 조건을 만족하는 숫자 쌍은 (2, 12), (4, 6), (6, 4), (12, 2)로 총 4가지입니다. 따라서 프로그램은 쌍의 개수인 4를 출력해야 합니다. 핵심 아이디어 두 수 a와 b의 최대공약수가 g이고 최소공배수가 l이라면 다음과 같은 성질이 성립합니다. l은 반드시 g로 나누어 떨어져야 합니다. 그렇지 않다면 조건을 만족하
문제 개요하나의 자연수 n이 주어졌을 때, 이 수를 두 세제곱수의 합으로 표현하는 서로 다른 두 쌍을 찾아야 합니다. 즉, 다음 조건을 만족하는 네 개의 정수 a, b, c, d를 구하는 것이 목표입니다.n = a3 + b3 = c3 + d3예를 들어 유명한 라마누잔 수인 1729는 1729 = 13 + 123 = 93 + 103처럼 두 가지 방법으로 표현되는 대표적인 예입니다.접근 방법핵심 아이디어는 매우 단순합니다. a, b, c, d는 모두 n의 세제곱근(n1/3)보다 작거나 같은 수여야 한다는 점에 착안합니다.n1/3 이하의
문자열과 하나의 정수 k가 주어졌을 때, 길이가 정확히 k인 모든 부분 문자열 가운데 문자들의 ASCII 값 합이 k로 나누어 떨어지는 것의 개수를 구하는 문제를 풀어보겠습니다.예를 들어 문자열이 BCGABC이고 k가 3이라고 가정해 보겠습니다. 부분 문자열 BCG의 ASCII 합은 204(B=66, C=67, G=71)이고, ABC의 ASCII 합은 198(A=65, B=66, C=67)입니다. 두 값 모두 k=3으로 나누어 떨어지므로 조건을 만족하는 부분 문자열은 총 2개입니다.접근 방법풀이 방법은 간단합니다. 먼저 첫 번째 부
개요이 글에서는 정수의 1의 보수(1s Complement)를 구하는 방법을 알아보겠습니다. C++에서는 비트 반전 연산자(~)를 사용하면 이 작업을 매우 빠르게 수행할 수 있지만, 이 연산자는 32비트 전체(4바이트 정수)에 대한 보수를 만들어냅니다. 여기서 우리가 원하는 것은 해당 숫자가 실제로 사용하는 n비트에 대한 보수입니다.예를 들어 22라는 숫자가 있다고 가정해 보겠습니다. 22의 이진수 표현은 10110이며, 이를 비트 단위로 반전하면 01001, 즉 10진수로 9가 됩니다. 그렇다면 이 값을 어떻게 계산할 수 있을까요
플뢰리(Fleury) 알고리즘이란?플뢰리(Fleury) 알고리즘은 주어진 그래프에서 오일러 경로(Euler Path) 또는 오일러 회로(Euler Circuit)를 찾아 출력하는 고전적인 알고리즘입니다. 여기서 오일러 경로란 그래프의 모든 간선을 정확히 한 번씩만 지나는 경로를 말하며, 오일러 회로는 그 경로가 다시 시작 정점으로 돌아오는 경우를 의미합니다.이 알고리즘은 한 간선에서 출발하여 인접한 정점들을 순서대로 이동하면서, 이미 지나간 간선을 그래프에서 제거해 나가는 방식으로 동작합니다. 이 과정을 반복하면 그래프가 단계마다
정수 오버플로를 다루는 가장 안전한 방법은 오버플로가 발생하기 전에 미리 검사하는 것입니다. 하지만 이미 발생한 오버플로를 확인하는 몇 가지 트릭성 방법들도 존재합니다. 부호 없는 정수 덧셈의 오버플로 감지 예를 들어 unsigned int 덧셈에서 오버플로를 감지하려면, 연산 결과가 실제로 더해진 두 값 중 하나보다 작아졌는지 확인하면 됩니다. 예제 코드 unsigned int x, y; unsigned int value = x + y; bool overflow = value < x; // "value < y
문제 개요이번 글에서는 흥미로운 문자열 문제를 다뤄보겠습니다. 주어진 이진 문자열(binary string)에서 1로 이루어진 구간 사이에 0이 존재하는지를 판별하는 것입니다. 만약 1과 1 사이에 0이 없다면 그 문자열은 유효(valid)하고, 하나라도 있다면 유효하지 않은(invalid) 문자열입니다.예를 들어, 다음과 같은 세 개의 문자열이 있다고 가정해 보겠습니다.A: 10001111010B: 00001111100C: 01111101111이 세 문자열 중 오직 B만 유효합니다. B는 앞부분의 0들 뒤에 1이 연속해서 나타나며
문제 개요 이번 글에서는 흥미로운 문자열 문제를 다뤄보겠습니다. 주어진 이진(binary) 문자열이 다음 조건을 모두 만족하는지 판별하는 코드를 작성해야 합니다. 연속된 1로 이루어진 모든 그룹의 길이는 반드시 2여야 합니다. 즉, 1은 11 형태로만 나타날 수 있습니다. 연속된 1의 그룹은 반드시 하나 이상의 0 뒤에 나타나야 합니다. 따라서 문자열이 1로 시작해서는 안 됩니다. 예를 들어 0110은 조건을 만족하는 유효한 문자열입니다. 반면 001110은 1이 세 개 연속으로 나오므로, 010은 1이 하나만 나오므로 각각 유