삽입 정렬(Insertion Sort)은 마치 손에 든 카드를 정리하듯 요소를 하나씩 제자리에 삽입하며 데이터를 정렬하는 대표적인 정렬 알고리즘입니다. 배열을 왼쪽에서 오른쪽으로 순회하되, 첫 번째 요소는 이미 정렬된 것으로 간주하고 나머지 요소들을 왼쪽의 정렬된 목록에 차례대로 삽입합니다. 각 요소는 자신이 들어갈 올바른 위치를 찾을 때까지 왼쪽 목록의 요소들과 계속 비교하게 됩니다. 삽입 정렬 알고리즘 int arr[5] = { 5, 4, 2, 1, 3 }; int i, j; j = i + 1부터 j < 배열 크기까지 순
두 개의 문자열 Str과 subStr이 입력으로 주어집니다. 목표는 subStr에 담긴 텍스트가 Str 안에 부분 문자열(substring)로 존재하는지 확인하는 것입니다. 문자열 X가 문자열 Y 안에 최소 한 번 이상 온전히 포함되어 있다면, X를 Y의 부분 문자열이라고 부릅니다. 이 문제는 재귀(recursion) 기법을 활용하여 해결할 수 있습니다. 예제 입력 − Str = tutorialspoint, subStr = Point 출력 − 주어진 문자열은 해당 부분 문자열을 포함하지 않습니다! 설명 &m
숫자가 포함된 문자열이 주어졌을 때, 재귀(recursion) 기반의 atoi() 구현을 통해 이에 대응하는 정수 값을 구하는 것이 목표입니다. C 표준 라이브러리의 int atoi(const char *str) 함수는 문자열 인수 str을 정수(int) 타입으로 변환하는 역할을 합니다.예제입력 − Str[] = 58325출력 − 변환된 정수 값 : 58325설명 − 문자열 58325에 해당하는 숫자는 58325입니다.입력 − Str[] = 00010출력 − 변환된 정수 값 : 10설명 − 앞의 0은 무시되며, 문자열에 해당하는 숫
정수 하나가 입력으로 주어졌을 때, 재귀(recursion)를 이용하여 해당 숫자가 소수인지 아닌지 판별하는 것이 목표입니다.어떤 수가 소수인지 확인하려면 i=2부터 i<=Num/2까지 차례대로 검사합니다. 이 범위에서 Num을 나누어 떨어지게 하는 값이 하나라도 존재한다면 그 수는 소수가 아닙니다. 소수는 1과 자기 자신으로만 나누어 떨어지는 수이기 때문입니다.예제입력 − Num = 32출력 − 32은(는) 소수가 아닙니다!설명 − i=2부터 i<=32/2까지 검사하면, 가장 먼저 32가 2로 나누어 떨어지므로 소수가
정수 하나가 입력으로 주어졌을 때, 재귀(recursion)를 이용해 이 숫자 Num이 회문(palindrome)인지 아닌지 판별하는 것이 목표입니다.회문 여부를 확인하는 방법은 간단합니다. 숫자를 뒤집은 값과 원래 값을 비교하면 됩니다. 뒤집힌 숫자가 원래 숫자와 완전히 같다면 그 수는 회문입니다.예시입력 − Num = 34212출력 − 34212는 회문이 아닙니다!설명 − 34212를 뒤집으면 21243이 됩니다. 34212 ≠ 21243이므로 입력된 숫자는 회문이 아닙니다.입력 − N
정수 하나가 입력으로 주어졌을 때, 재귀(recursion)를 사용하여 n개 수의 GCD(최대공약수) 공식을 출력하는 것이 목표입니다.세 수 a1, b1, c1의 최대공약수는 gcd(a1, gcd(b1, c1)) 형태로 표현할 수 있습니다. 마찬가지로 세 개보다 많은 수에 대해서도 gcd(a1, gcd(b1, gcd(c1, …, gcd(y1, z1))))와 같은 공식으로 최대공약수를 구할 수 있습니다.예시입력 − Num = 4;출력 − 공식:GCD(int a3, GCD(int a2, GCD(int a1, int b1)))입력 − N
2진수가 담긴 문자열이 주어졌을 때, 재귀(recursion) 기법을 사용하여 이에 해당하는 10진수 값을 구하는 것이 이 글의 목표입니다. 2진수를 10진수로 변환하는 원리 2진수는 다음과 같은 방법으로 10진수로 변환할 수 있습니다. 최하위 비트(LSB)부터 최상위 비트(MSB)까지 각 자릿수를 순회하면서, 각 자릿수에 2i(단, 0 ≤ i ≤ 자릿수 개수)를 곱하고 그 모든 결과를 합산하는 것입니다. 입력 및 출력 예시 예제 1 입력 − binStr[] = 110010 출력 − 주어진 2진수에 해당하는 10진수: 50 설명
정수 배열 Arr[]가 입력으로 주어졌을 때, 재귀(순환 호출) 방식을 사용해 배열 안에서 최댓값과 최솟값을 찾는 것이 이 글의 목표입니다. 재귀로 문제를 해결하기 때문에 배열을 계속 탐색하다가 길이가 1이 되는 순간 A[0]을 반환하는데, 이것이 곧 기저 사례(base case)입니다. 그 외의 경우에는 현재 요소를 지금까지 구한 최솟값 또는 최댓값과 비교하고, 남은 요소들을 대상으로 재귀 호출을 이어가며 값을 갱신해 나갑니다. 입출력 시나리오 살펴보기 입력 − Arr = {12, 67, 99, 76, 32}; 출력 − 배열의 최
정수 Num이 입력으로 주어졌을 때, 스택(Stack) 자료구조를 활용해 그 숫자를 뒤집은 값을 구하는 것이 이 글의 목표입니다. 스택(Stack)이란? 스택은 C++에서 데이터를 LIFO(Last In First Out, 후입선출) 방식으로 저장하는 자료구조입니다. 가장 나중에 넣은 데이터가 가장 먼저 나오는 구조이며, 주요 연산은 다음과 같습니다. 선언 방법: stack<int> stck; // stck가 스택 변수가 됩니다. top() – 최상단 요소 확인: stck.top()은 스택의 가장 위에 있는 요소에 대
선택 정렬(Selection Sort)은 배열을 처음부터 순회하면서 각 위치에 남아 있는 요소 중 가장 작은 값을 찾아 교체하는 방식으로 데이터를 정렬하는 대표적인 정렬 알고리즘입니다. 정렬이 진행될수록 왼쪽 부분은 정렬된 상태가 되고, 오른쪽 부분은 아직 정렬되지 않은 상태로 남습니다. 매 단계마다 교환(swap)을 통해 그다음으로 작은 요소가 현재 인덱스 위치에 배치됩니다. 선택 정렬 알고리즘 int arr[5] = { 5, 4, 2, 1, 3 }; int i, j; 인덱스 i = 0부터 i < 배열 크기 - 1까지 순
문제 소개정수형 변수 Number가 입력으로 주어집니다. 1부터 Number까지의 범위에 속한 값들이 정렬된 순서로 담긴 배열을 생각해 보겠습니다. 이 배열에 대해 매 단계마다 홀수 번째 위치에 있는 요소들을 제거하는 연산을 수행합니다. 목표는 이 연산을 배열에 단 하나의 요소만 남을 때까지 반복한 뒤, 마지막에 남은 요소를 출력하는 것입니다.참고: 요소의 위치는 인덱스 0에 해당하는 요소를 1번째 위치로 간주하며, 이후 순차적으로 계산합니다.배열 요소 개수별 테스트 케이스입력 Number=1, 출력 = 1입력 Number=2, 출
정수 변수 Number가 입력으로 주어졌다고 가정해 봅시다. 1부터 Number까지 범위의 값들이 임의의 순서로 들어 있는 배열이 있으며, 이 배열에 다음과 같은 연산을 Number−1번 수행합니다.배열에서 두 개의 요소 A와 B를 선택합니다.A와 B를 배열에서 제거합니다.A² + B², 즉 두 수의 제곱의 합을 배열에 다시 추가합니다.연산이 모두 끝나면 배열에는 하나의 정수만 남게 됩니다. 목표는 이렇게 만들어진 마지막 값이 가질 수 있는 최댓값을 구하는 것입니다.우선순위 큐(Priority Queue)를 활용한 접근최종 결과를
문제 개요 두 개의 정수 Num1과 Num2가 입력으로 주어집니다. 이 두 정수는 분수 Num1/Num2로 표현할 수 있으며, 목표는 이 분수를 더 이상 약분할 수 없는 기약분수(가장 간단한 형태)로 만드는 것입니다. GCD(최대공약수)를 이용한 약분 원리 두 수의 최대공약수(GCD)를 계산합니다. 두 수를 각각 GCD로 나눕니다. 나눈 결과인 몫을 변수에 다시 저장합니다. 최종적으로 Num1/Num2가 기약분수가 됩니다. 여기서 사용되는 GCD 계산은 유클리드 호제법(Euclidean Algorithm)을 기반으로 하며, 시
정수 하나가 입력으로 주어졌을 때, 이 숫자를 1로 만들기 위해 필요한 최소 연산 횟수를 구하는 것이 이 글의 목표입니다. 사용할 수 있는 연산은 다음 두 가지입니다. 숫자가 짝수라면 2로 나눕니다. 숫자가 홀수라면 1을 더하거나 뺍니다. 예시 입력 − Number = 28 출력 − 28을 1로 줄이는 최소 단계 수: 6 풀이 과정 − 28은 짝수 → 2로 나누기 = 14 14는 짝수 → 2로 나누기 = 7 7은 홀수 → 1 더하기 = 8 8은 짝수 → 2로 나누기 = 4 4는 짝수 → 2로 나누기 = 2 2는 짝수 → 2로
2차원 행렬(matrix)은 크게 두 가지 방식으로 순회(traversal)할 수 있습니다. 행 우선(row-major) 순회는 첫 번째 행부터 시작하여 두 번째 행, 세 번째 행 순으로 마지막 행까지 차례대로 방문하며, 각 행의 요소는 인덱스 0부터 마지막 인덱스까지 순서대로 읽습니다.반면 열 우선(column-major) 순회는 첫 번째 열부터 마지막 열까지 순서대로 요소를 탐색하는 방식입니다.2차원 행렬을 M[i][j]로 표현할 때, 인덱스 i는 행(row)을, 인덱스 j는 열(column)을 나타냅니다.행 우선 순회의 인덱스
2차원 정사각형 행렬이 입력으로 주어졌을 때, 주대각선(primary diagonal)과 부대각선(secondary diagonal) 양쪽에 공통으로 존재하는 요소들을 찾는 것이 목표입니다. 예를 들어 입력 행렬이 다음과 같다면,1 2 3 2 2 4 1 4 7주대각선은 1 2 7이고 부대각선은 3 2 1입니다. 따라서 공통 요소는 2입니다.두 대각선에는 항상 최소 한 개 이상의 공통 요소가 존재합니다. 특히 홀수 크기의 행렬이라면 중앙에 위치한 요소가 두 대각선에 동시에 속하기 때문입니다.예시입력 − Matrix[][5]
개요정수들이 임의의 순서로 저장된 정수 배열 Arr[]이 주어졌을 때, 배열에 대한 재귀(recursion) 탐색을 이용해 입력 정수 val이 배열 안에 존재하는지 찾는 것이 목표입니다.만약 val이 배열 Arr[]에서 발견되지 않으면 -1을 반환하고, 발견된 경우에는 해당 값의 인덱스(index)를 출력합니다.예제입력 − Arr[] = {11, 43, 24, 50, 93, 26, 78}, val = 26출력 − 26 found at index 5설명 −배열의 요소는 인덱스 0부터 인덱스 (배열 길이 - 1)까지 존재합니다. 첫 번
정수 값들이 주어지고, 이 값들을 이용해 연결 리스트(Linked List)를 구성한다고 가정해 봅시다. 이번 글에서는 재귀(Recursion) 기법을 활용해 단일 연결 리스트(Singly Linked List)에 노드를 삽입하고, 이어서 전체 리스트를 순회하며 값을 출력하는 방법을 단계별로 살펴보겠습니다. 리스트 끝에 노드를 재귀적으로 추가하기 head가 NULL이면 → 새 노드를 생성해 head로 설정합니다. 그렇지 않으면 → head->next를 인자로 넘기며 자기 자신을 재귀 호출합니다. 노드를 재귀적으로 순회하기
단일 연결 리스트(Singly Linked List)가 입력으로 주어졌을 때, 목표는 원본 리스트의 노드를 하나씩 교대로 가져가는 두 개의 단일 연결 리스트로 분할하는 것입니다. 예를 들어 입력 리스트가 a → b → c → d → e → f라면, 분할 후 생성되는 두 개의 하위 리스트는 각각 a → c → e와 b → d → f가 됩니다.이 문제는 두 개의 포인터 N1과 N2를 사용해 해결할 수 있습니다. 하나는 원본 리스트의 헤드(head)를 가리키
문제 소개 단일 연결 리스트(Singly Linked List)와 양의 정수 N이 입력으로 주어진 상황을 가정해 보겠습니다. 목표는 재귀(recursion)를 활용하여 리스트의 뒤에서 N번째에 해당하는 노드를 찾아내는 것입니다. 예를 들어 입력 리스트가 a → b → c → d → e → f 형태이고 N이 4라면, 뒤에서 4번째 노드는 c가 됩니다. 해결 아이디어는 간단합니다. 먼저 재귀 호출을 통해 리스트의 마지막 노드까지 진입한 뒤, 재귀에서 되돌아오는 과정(백트래킹) 동안 카운트 값을 하나씩 증가시킵니다. 그리고 카운트가 N과