재귀(Recursion)란 어떤 작업을 자기 자신과 유사한 형태로 반복해서 처리하는 방식을 말합니다. 프로그래밍 언어에서 하나의 함수가 그 함수 내부에서 자기 자신을 다시 호출할 수 있을 때, 이를 해당 함수의 재귀 호출(recursive call)이라고 부릅니다. 아래 예제처럼 재귀 함수를 활용하면 문자열을 손쉽게 뒤집을 수 있습니다.예제 코드#include <bits/stdc++.h> using namespace std; void reverse(string str){ if(s
숫자 n이 주어졌을 때, n줄에 걸쳐 무표정 얼굴(Expressionless Face) 패턴을 생성하고 결과를 출력하는 것이 이번 문제의 목표입니다. 무표정 얼굴은 특수 문자를 조합하여 표현하며, 완성된 모습은 *_*처럼 보입니다. 별(*)과 밑줄(_)을 규칙적으로 배치하면 마치 눈과 입이 없는 얼굴을 연상시키는 대칭형 패턴이 만들어집니다. 예시 입력-: n = 6 출력-: 입력-: n = 8 출력-: 알고리즘 패턴 출력 로직은 두 개의 함수로 나누어 구현합니다. 하나는 별을 반복 출력하는 보조 함수이고, 다른 하나는 전체 패턴
문제 설명 두 양의 정수 N과 K가 주어졌을 때, 숫자 N에서 몇 개의 자릿수를 제거해야 제거 후 남은 수가 10K(10의 거듭제곱)으로 나누어 떨어지는지, 그 최소 제거 자릿수를 구하는 문제입니다. 만약 어떻게 해도 조건을 만족할 수 없다면 -1을 출력합니다. 예시 N = 10203027, K = 2인 경우를 생각해 보겠습니다. 이때 제거해야 할 자릿수는 3개입니다. 자릿수 3, 2, 7을 차례로 제거하면 숫자는 10200이 되고, 10200은 102 = 100으로 나누어 떨어집니다. 알고리즘 접근 방식 이 문제의 핵심은 간단합
이 글에서는 크기가 n인 실수(float) 배열이 주어졌을 때, 해당 배열의 변동 계수(Coefficient of Variation)를 계산하고 그 결과를 출력하는 C++ 프로그램을 다룹니다.변동 계수란 무엇인가?통계학에서 변동 계수는 주어진 데이터의 변동성(variability) 정도를 상대적으로 평가할 때 사용되는 대표적인 지표입니다.금융 분야에서도 널리 활용되는데, 투자 금액 대비 어느 정도의 위험이 따르는지를 판단하는 기준으로 쓰입니다. 표준편차와 평균의 비율이 낮다면 해당 투자에 내재된 위험도 낮다고 해석할 수 있습니다.즉
문제 설명N개의 정수로 구성된 배열 arr[]가 주어졌을 때, 남은 요소들의 합이 짝수가 되도록 만들기 위해 배열에서 제거해야 하는 요소의 최소 개수를 구하는 프로그램을 작성해야 합니다.예시입력 배열이 {10, 20, 30, 5}라고 가정해 보겠습니다. 이 배열의 전체 합은 65로 홀수입니다. 따라서 합을 짝수로 만들려면 요소 하나, 즉 5를 제거해야 합니다. 5를 제거하면 나머지 요소들의 합은 10 + 20 + 30 = 60으로 짝수가 되어 조건을 만족합니다.알고리즘이 문제는 정수의 덧셈 성질을 활용하면 매우 간단하게 해결할 수
프로세스와 각 프로세스의 버스트 시간(Burst Time)이 주어졌을 때, 최단 작업 우선(Shortest Job First, SJF) 비선점형 방식을 적용하여 대기 시간과 반환 시간(Turnaround Time)을 구하고, 그 평균값까지 계산해 출력하는 것이 이번 글의 목표입니다. SJF(최단 작업 우선) 스케줄링이란? 최단 작업 우선(SJF) 스케줄링은 비선점형(Non-preemptive) 방식을 따르는 작업·프로세스 스케줄링 알고리즘입니다. 스케줄러는 대기 큐에서 완료까지 필요한 시간이 가장 짧은 프로세스를 선택해 CPU를
문제 설명N개의 정수로 이루어진 배열 arr[]가 주어졌을 때, 남은 원소들의 합이 홀수가 되도록 만들기 위해 제거해야 하는 원소의 최소 개수를 구하는 프로그램을 작성해야 합니다.예시입력 배열이 {10, 20, 30, 5, 7}이라면, 배열의 전체 합은 72(짝수)입니다. 이때 원소 중 하나인 5 또는 7만 제거하면 나머지 원소들의 합이 홀수가 되므로, 최소 제거 횟수는 1입니다.알고리즘이 문제는 수학적 성질을 이용하면 매우 간단하게 해결할 수 있습니다.1. 짝수는 몇 개를 더해도 그 합은 항상 짝수입니다. 2. 홀수를 홀수 번 더
문제 개요주어진 문자열에 대해, 회전(rotation)을 반복 수행했을 때 원래 문자열과 다시 동일해지기까지 필요한 최소 회전 횟수를 구하는 문제입니다.예시입력 문자열이 bbbbb라면 모든 문자가 동일하므로 한 번만 회전해도 원래 문자열과 같아집니다. 따라서 최소 회전 횟수는 1입니다.핵심 아이디어와 알고리즘이 문제의 핵심은 원본 문자열을 자기 자신과 이어 붙인 문자열(s + s) 안에는 원본 문자열의 모든 회전 형태가 포함되어 있다는 사실입니다. 이를 활용하면 각 인덱스에서 부분 문자열을 잘라 원본과 비교하는 방식으로 최소 회전
문제 정의숫자(정수) 문자만으로 구성된 문자열이 주어집니다. 한 번의 단계에서 회문(palindrome)인 부분 문자열을 삭제할 수 있을 때, 이 문자열 전체를 최소 단계로 모두 제거하는 방법을 구하는 것이 목표입니다. 부분 문자열을 삭제한 후에는 남은 앞뒤 부분들이 서로 연결되어 하나의 문자열이 됩니다.예시입력 문자열이 3441213이라면 최소 2단계가 필요합니다.먼저 문자열에서 121을 제거합니다. 남은 문자열은 3443입니다.남은 문자열 3443 자체가 회문이므로 한 번에 모두 제거합니다.알고리즘이 문제는 동적 계획법(Dyna
문제 설명크기가 n인 배열이 주어졌을 때, 배열의 모든 요소를 4로 나누어 떨어지도록 만들기 위해 필요한 최소 연산 횟수를 구하는 것이 목표입니다. 여기서 한 번의 연산(step)은 배열에서 임의의 두 요소를 제거하고, 그 두 요소의 합을 새로운 요소로 배열에 추가하는 것으로 정의됩니다.예시입력 배열이 {1, 2, 0, 2, 4, 3}이라면 다음과 같이 2번의 연산만으로 모든 요소를 4의 배수로 만들 수 있습니다.연산 1: 1 + 3 = 4연산 2: 2 + 2 = 4배열에 있는 0과 4는 이미 4로 나누어 떨어지므로 별도의 연산 없
프로세스 목록과 각 프로세스의 버스트 시간(Burst Time)이 주어졌을 때, 선점형 최단 작업 우선(SJF, Shortest Job First) 스케줄링 방식을 사용하여 각 프로세스의 대기 시간과 반환 시간, 그리고 두 값의 평균을 구해 출력하는 것이 이 글의 목표입니다.SJF(최단 작업 우선) 스케줄링이란?최단 작업 우선(SJF) 스케줄링은 대기 큐에서 실행 시간이 가장 짧은 프로세스를 선택해 CPU를 할당하는 작업 스케줄링 알고리즘입니다. SJF는 평균 대기 시간을 최소화하여 시스템 처리량(throughput)을 높일 수 있
문제 설명이진 문자열(0과 1로만 이루어진 문자열)이 주어졌을 때, 문자열 내에 존재하는 부분 문자열 010 패턴을 모두 제거하기 위해 필요한 최소 변경 횟수를 구하는 것이 이번 문제의 목표입니다.여기서 제거란 문자열에서 문자를 삭제하는 것이 아니라, 특정 문자를 다른 문자로 변경하여 010 패턴이 더 이상 나타나지 않도록 만드는 것을 의미합니다.예시입력 문자열이 010010이라면 총 2단계가 필요합니다.첫 번째 0을 1로 변경합니다. → 문자열은 110010이 됩니다.마지막 0을 1로 변경합니다. → 최종 문자열은 110011이
문제 설명크기가 NxN인 정수 행렬 A가 주어집니다. 이때 A를 통과하는 하강 경로(falling path)의 최소 합을 구하는 것이 목표입니다.하강 경로는 첫 번째 행의 임의의 원소에서 시작하여 마지막 행의 원소에서 끝납니다.경로는 다음 행마다 하나의 원소를 선택하며, 다음 행에서 선택하는 원소의 열은 이전 행에서 선택한 열과 최대 1칸 차이까지만 허용됩니다. 즉, 바로 아래, 왼쪽 아래 대각선, 오른쪽 아래 대각선 위치 중 하나만 선택할 수 있습니다.예시N = 2이고 행렬이 다음과 같다면: { {5, 10}, {2
정수형 데이터와 우선순위(priority) 값이 주어졌을 때, 주어진 우선순위에 따라 이중 연결 리스트(doubly linked list)를 구성하고 그 결과를 출력하는 것이 이 글의 목표입니다. 우선순위 큐(Priority Queue)란? 큐(Queue)는 먼저 삽입된 요소가 가장 먼저 제거되는 FIFO(First In, First Out) 방식의 자료구조입니다. 우선순위 큐는 큐의 한 종류로, 각 요소가 가진 우선순위에 따라 삽입과 삭제가 이루어집니다. 우선순위 큐는 일반 큐, 스택 또는 연결 리스트 등 다양한 자료구조로 구현
두 개의 주사위 쌍을 N번 던졌을 때, 원하는 합(sum)이 나올 확률을 계산하는 것이 이 글의 목표입니다. 입력으로는 목표 합계와 주사위를 던지는 횟수 N이 주어지며, 프로그램은 해당 합계가 나올 확률을 출력합니다.확률이란 주어진 데이터 집합에서 우리가 원하는 결과가 나올 가능성을 의미합니다. 확률의 범위는 항상 0과 1 사이이며, 0은 해당 사건이 절대 일어나지 않음(불가능)을, 1은 반드시 일어남(확실성)을 나타냅니다.예제입력: sum = 12, N = 1 출력: Probability = 1/36 설명: 두 개의 주사위를 한
n개의 정수로 이루어진 배열 arr[n]과 부분 수열의 크기를 정의하는 정수 k가 주어졌을 때, 최솟값과 최댓값을 제외한 크기 k의 모든 부분 수열(subsequence)의 곱을 구하는 것이 이 문제의 목표입니다.문제 이해하기예를 들어 원소 4개짜리 집합 {1, 2, 3, 4}와 k = 2가 주어졌다고 가정해 보겠습니다. 이때 만들어질 수 있는 부분 수열은 다음과 같습니다.{1, 2}, {2, 3}, {3, 4}, {1, 4}, {1, 3}, {2, 4}여기서 최댓값인 4와 최솟값인 1을 제외하면 남는 원소는 다음과 같습니다.2,
우선순위 큐(Priority Queue)는 우선순위가 지정된 요소들의 컬렉션을 저장하는 추상 자료형(ADT, Abstract Data Type)입니다. 각 요소는 우선순위에 따라 삽입과 삭제가 이루어지며, 가장 높은 우선순위를 가진 요소가 언제든지 먼저 제거될 수 있습니다.일반적인 스택(Stack), 큐(Queue), 리스트(List)와 달리, 우선순위 큐는 요소를 선형적인 위치 순서로 저장하지 않습니다. 대신 각 요소의 우선순위 값을 기준으로 내부적으로 정렬하여 관리합니다. C++의 STL에서 우선순위 큐는 기본적으로 최대 힙(M
확률(Probability)이란 주어진 데이터 집합에서 원하는 결과가 나올 가능성을 의미합니다. 확률의 값은 항상 0과 1 사이에 존재하며, 0은 불가능함을, 1은 반드시 일어남을 나타냅니다.확률이란 무엇인가?수학에서 확률은 사건이 일어날 불확실성을 정량적으로 계산할 수 있게 해주는 도구입니다. 다시 말해 확률은 특정 사건이 발생할 가능성을 0과 1 사이의 숫자로 표현하는 학문이라고 할 수 있습니다.예를 들어, 편향되지 않은 동전을 던졌을 때 앞면이 나올 확률은 0.5이며, 주사위를 굴렸을 때 3이 나올 확률은 1/6(약 0.166
문자 a와 b로 구성된 문자열이 주어졌을 때, 이 문자열이 a로 시작하면서 a로 끝나는지 여부를 DFA(Deterministic Finite Automata)를 통해 판별하는 것이 이번 글의 목표입니다.DFA(결정적 유한 오토마타)란 무엇인가?이론 컴퓨터 과학의 한 분야인 계산 이론에서 결정적 유한 오토마타(DFA)는 기호(symbol)로 이루어진 문자열을 받아들이거나 거부하는 유한 상태 기계(finite state machine)입니다. 여기서 결정적(deterministic)이라는 말은 수행되는 계산 경로가 항상 유일하다는 의미
2차원 평면 위에서 두 직선이 주어졌을 때, 이 두 직선이 만나는 지점인 교차점(Intersection Point)을 구하는 방법과 C++ 구현 코드를 소개합니다.문제 정의직선 AB를 구성하는 두 점 A와 B, 그리고 직선 PQ를 구성하는 두 점 P와 Q가 주어졌을 때, 두 직선의 교차점을 찾는 것이 목표입니다.참고: 모든 좌표는 X축과 Y축으로 이루어진 2차원 평면 위의 점으로 주어집니다.예를 들어 A(a1, a2), B(b1, b2)와 C(c1, c2), D(d1, d2)가 각각 서로 다른 두 직선을 형성하고 있으며, P(p1,