문제 개요문자열 str1이 입력으로 주어집니다. 목표는 입력 문자열에서 동일한 문자가 연속으로 나타나는 쌍 사이에 *를 삽입하고, 재귀(recursion) 기법을 활용해 그 결과 문자열을 얻는 것입니다.예를 들어 입력 문자열이 str1 = wellness라면, 연속된 문자 쌍 ll과 ss 사이에 *가 삽입되어 출력은 wel*nes*s가 됩니다.예시입력 − str1=happiness출력 − * 삽입 후 문자열: hap*pines*s설명 − 연속된 문자 쌍 pp와 ss 사이에 *를 삽입하면 결과 문자열 hap*pines*s가 됩니다.입
직사각형의 넓이가 입력으로 주어졌을 때, 길이와 너비의 차이가 최소가 되도록 하는 두 변의 길이를 구하는 것이 이 문제의 핵심입니다.사각형의 넓이 = 길이 × 너비예시입력 − 넓이 = 100출력 − 차이가 최소인 사각형의 변:길이 = 10, 너비 = 10설명 − 넓이가 100이 되는 변의 조합으로는 2-50, 4-25, 5-20, 10-10이 있습니다. 이 중 차이가 최소인 조합은 10-10이며, 그 차이는 0입니다. 정사각형은 모든 변의 길이가 같은 특별한 형태의 직사각형이라는 점을 기억해두면 이해하기 쉽습니다.입력 − 넓이 =
임의의 길이를 가진 문자열 str이 주어졌을 때, 결과 문자열에서 동일한 문자가 서로 인접하여 배치되지 않도록 주어진 문자열을 재배치하는 것이 과제입니다.입출력 시나리오 살펴보기입력 − string str = itinn출력 − 인접한 두 문자가 같지 않도록 문자열의 문자를 재배치한 결과: initn설명 − 문자열 타입 변수 str이 주어집니다. 이제 입력 문자열의 문자들을 동일한 문자가 같은 위치에 연달아 나오지 않도록 재배치합니다. 즉, nn은 서로 같고 인접해 있으므로 위치를 조정합니다. 그 결과 최종 문자열은 initn이 됩니
정수형 값이 하나 주어집니다. 이 문제의 목표는 주어진 수가 리팩터러블 숫자(Refactorable Number)인지 판별하고, 맞다면 리팩터러블 숫자입니다, 아니라면 리팩터러블 숫자가 아닙니다를 출력하는 것입니다.리팩터러블 숫자란 무엇일까요?리팩터러블 숫자는 자기 자신의 약수 개수로 나누어 떨어지는 수를 의미하며, 타우 숫자(tau number)라고도 불립니다. 예를 들어, 9의 약수는 총 3개(1, 3, 9)이고 9는 3으로 나누어 떨어지므로, 9는 리팩터러블 숫자입니다.입력 및 출력 시나리오 살펴보기입력 − int number
2차원 배열로 구성된 행렬이 주어졌을 때, 이를 시계 방향으로 90도 회전해야 합니다. 회전 결과는 마지막 행이 첫 번째 열이 되고, 두 번째 행은 두 번째 열, 첫 번째 행은 세 번째 열이 됩니다. 여기서 핵심 과제는 추가 공간(임시 배열)을 사용하지 않고 제자리(in-place)에서 회전을 수행하는 것입니다.입력 및 출력 예시예시 1입력:int arr[row_col_size][row_col_size] = { { 5, 1, 4}, { 9, 16, 12 }, { 2, 8, 9}}출력:2 9 5 8 16 1 9 12 4
2차원 배열로 구성된 정방행렬(N×N)이 주어졌을 때, 이를 시계 방향으로 90도 회전하는 것이 목표입니다. 회전이 완료되면 첫 번째 행은 마지막 열로, 두 번째 행은 가운데 열로 이동하는 형태가 됩니다. 여기서 핵심 조건은 어떠한 추가 공간(보조 배열)도 사용하지 않고 원본 배열 자체에서(in-place) 연산을 수행해야 한다는 점입니다.입출력 예시입력int arr[row_col_size][row_col_size] = { { 5, 1, 4}, { 9, 16, 12 }, { 2, 8, 9}}출력추가 공간 없이 행렬을
단어 목록이 주어졌을 때, 재귀(recursion) 기법을 활용하여 각 목록에서 단어를 하나씩 선택함으로써 만들 수 있는 모든 가능한 문장을 생성하는 것이 이 글의 목표입니다. 이때 각 목록에서는 한 번에 한 단어씩만 가져올 수 있습니다. 입출력 시나리오 살펴보기 입력 − sentence[row][col] = {{"I", "You"}, {"Do", "like"}, {"walking"
문제 개요두 개의 정수 number와 repeat가 입력으로 주어집니다. 목표는 입력 숫자를 repeat번 반복해 이어 붙여 만든 수의 각 자릿수를 모두 더하고, 그 합이 한 자리 숫자가 될 때까지 같은 과정을 반복하는 것입니다.예를 들어 입력 숫자가 123이고 repeat=2라면, 123123의 자릿수 합은 1+2+3+1+2+3=12가 됩니다. 12는 아직 한 자리 숫자가 아니므로 다시 12의 자릿수 합인 1+2=3을 계산합니다. 따라서 최종 출력값은 3입니다.입력·출력 예시예시 1입력 — number=32, repeat=3출력
정수 변수 number가 입력으로 주어졌을 때, 이 숫자의 각 자릿수를 더한 값을 구하고, 그 합이 소수(prime)인지 아닌지를 확인하는 것이 목표입니다. 단, 자릿수 합이 한 자리 숫자가 될 때까지 반복해서 더해야 하며, 최종적으로 얻어진 한 자리 숫자가 소수인지를 판별합니다.예를 들어 입력값이 123이라면 자릿수의 합은 1+2+3=6입니다. 6은 이미 한 자리 숫자이므로 반복을 멈추고, 6은 소수가 아니므로 NOT PRIME을 출력하게 됩니다.입력 및 출력 시나리오 살펴보기입력 − number = 12341출력 − 숫자의 재귀
정렬되지 않은 정수 배열이 주어졌을 때, 멀티스레딩(Multi-threading)으로 구현한 병합 정렬 기법을 사용해 배열을 정렬하는 것이 이 글의 목표입니다.병합 정렬(Merge Sort)이란?병합 정렬은 분할 정복(Divide and Conquer) 기법에 기반한 정렬 알고리즘입니다. 배열을 절반씩 계속 나눈 후, 정렬된 상태로 다시 결합하는 방식으로 동작합니다.병합 정렬 알고리즘리스트에 원소가 하나뿐이라면 해당 원소를 그대로 반환합니다.그렇지 않다면, 더 이상 나눌 수 없을 때까지 데이터를 재귀적으로 두 부분으로 분할합니다.마
2, 3, 5, 7, 8처럼 어떤 수의 제곱이 아닌 숫자들이 있다는 것은 누구나 알고 있습니다. 비제곱수는 무한히 많아서 모든 숫자를 일일이 외울 수는 없습니다. 이 글에서는 비제곱수(non-square number)가 무엇인지 설명하고, C++에서 N번째 비제곱수를 찾는 방법을 단계별로 자세히 다뤄보겠습니다.N번째 비제곱수란?어떤 수가 정수의 제곱이라면 그 수를 완전제곱수(perfect square)라고 부릅니다. 완전제곱수의 대표적인 예시는 다음과 같습니다.1은 1의 제곱 4는 2의 제곱 9는 3의 제곱 16은 4의 제곱 25는
C++에는 수학적 문제를 해결하는 데 활용할 수 있는 다양한 기능들이 있습니다. 그중 하나가 코드를 통해 홀수 자릿수로만 이루어진 N번째 숫자를 찾는 것입니다. 이 글에서는 홀수 자릿수로만 구성된 N번째 숫자를 찾는 전체 과정을 설명하고, 홀수의 개념과 어떤 숫자들이 홀수 자릿수로만 이루어지는지 자세히 살펴보겠습니다.홀수 자릿수로만 이루어진 N번째 숫자 찾기홀수는 2로 나누었을 때 나머지가 발생하는 수입니다. 처음 몇 가지 예를 들면 1, 3, 5, 7, 9, 11, 13, 15, 17, 19...와 같습니다.원하는 숫자를 찾기 위
이 글에서는 C++을 사용해 K진(K-ary) 트리에서 총 가중치가 W인 경로의 개수를 계산하는 방법을 알아보겠습니다. K진 트리란 각 노드가 정확히 K개의 자식 노드를 가지는 트리를 말하며, 한 노드에서 자식 노드들로 이어지는 간선에는 1부터 K까지의 가중치가 순서대로 부여됩니다. 우리가 구해야 하는 값은 루트에서 시작하는 경로 중 누적 가중치가 정확히 W이고, 가중치가 M 이상인 간선을 적어도 하나 포함하는 경로의 개수입니다. 예시는 다음과 같습니다. 입력 : W = 4, K = 3, M = 2 출력 : 6 이 문제는 동적
축구공을 자세히 관찰해 보면 오각형과 육각형이 마치 퍼즐 조각처럼 맞물려 완벽한 구 형태를 이루고 있는 것을 알 수 있습니다. 그렇다면 축구공 하나에는 정확히 몇 개의 오각형과 육각형이 사용되었을까요?오일러 특성(Euler Characteristic)으로 접근하기이 문제는 오일러 특성을 활용하면 아주 간단하게 해결할 수 있습니다. 오일러 특성은 위상수학(topology)에서 특정 도형이나 구조의 성질을 하나의 숫자로 나타내는 값으로, 축구공 표면의 오각형과 육각형 개수를 계산하는 데 유용하게 쓰입니다.오일러 특성에서 사용되는 기호는
문제 개요배열에서 두 원소의 쌍 a[i], a[j]가 a[i] > a[j]이면서 i < j를 만족할 때, 이를 역전(inversion)이라고 부릅니다. 이 문제에서는 두 수 N과 K가 주어지며, 첫 N개의 자연수(1부터 N까지)로 만들 수 있는 모든 순열 중에서 정확히 K개의 역전을 가진 순열이 몇 개인지 구해야 합니다.예시를 통해 살펴보겠습니다.입력: N = 4, K = 1출력: 3설명: 첫 4개 수의 전체 순열은 1234, 1243, 1324, 2134입니다.이중 역전이 1개인 순열은 1243, 1324, 2134로
이 글에서는 C++을 이용해 직각삼각형을 형성할 수 있는 빗변과 넓이 쌍의 개수를 구하는 방법을 알아보겠습니다.주어진 문제는 빗변 H와 넓이 A로 이루어진 모든 가능한 쌍 (H, A) 중에서, 실제로 직각삼각형을 만들 수 있는 쌍의 개수를 세는 것입니다.문제의 수학적 배경먼저 기호를 정리하면 다음과 같습니다.x : 직각삼각형의 밑변y : 직각삼각형의 높이H : 직각삼각형의 빗변직각삼각형의 넓이 공식은 다음과 같습니다.A = (x × y) / 2양변을 정리하면,4 × A² = (x × y)² …… (1)또한 피타
이 글에서는 양의 정수로 이루어진 배열 arr[]와 범위 쿼리 L, R이 주어졌을 때, 접두사 합(prefix sum) 배열 중 소수인 값의 개수를 찾는 방법을 알아봅니다. 여기서 L은 접두사 합 계산을 시작하는 시작 인덱스(arr[L])를 의미하고, R은 처리해야 할 마지막 인덱스를 의미합니다.접두사 합 배열을 채우려면 인덱스 L부터 R까지 순회하면서 현재 원소의 값을 접두사 합 배열의 이전 원소에 계속 더해 나가면 됩니다. 문제를 이해하기 위한 예시는 다음과 같습니다.입력 : arr[ ] = { 3, 5, 6, 2, 4 }L =
이 글에서는 C++을 사용해 배열에 존재하는 소수 쌍(prime pair)의 개수를 구하는 방법을 자세히 알아봅니다. 정수 배열 arr[]가 주어졌을 때, 배열 안에서 만들어질 수 있는 모든 소수 쌍을 찾아야 합니다. 먼저 문제의 예시부터 살펴보겠습니다.입력 : arr[ ] = { 1, 2, 3, 5, 7, 9 } 출력 : 6 주어진 배열에서 만들 수 있는 소수 쌍은 다음과 같습니다. (2, 3), (2, 5), (2, 7), (3, 5), (3, 7), (5, 7) 입력 : arr[] = {1, 4, 5, 9, 11} 출력
문제 소개이 글에서는 부분 배열(subarray)에 포함된 소수의 개수를 구하는 방법을 알아봅니다. 양의 정수로 이루어진 배열 arr[]와 두 개의 정수로 범위 {L, R}를 나타내는 q개의 쿼리가 주어졌을 때, 해당 범위 안에 있는 소수가 몇 개인지 구하는 것이 목표입니다.아래는 문제의 예시입니다.입력 : arr[] = {1, 2, 3, 4, 5, 6}, q = 1, L = 0, R = 3출력 : 2주어진 범위에서 소수는 {2, 3}입니다.입력 : arr[] = {2, 3, 5, 8, 12, 11}, q = 1, L = 0, R
사변형(quadrilateral)은 유클리드 평면 기하학에서 네 개의 꼭짓점과 네 개의 변을 가진 다각형을 의미합니다. 흔히 4각형(4-gon)이라고도 부르며, 경우에 따라 정사각형처럼 특정한 형태의 이름으로 불리기도 합니다.이 글에서는 주어진 점들로 만들 수 있는 사변형의 개수를 구하는 방법을 알아보겠습니다. 이 문제는 데카르트 좌표 평면상의 네 개의 점 (x, y)가 주어졌을 때, 이 점들을 이용해 만들 수 있는 사변형이 총 몇 개인지 구하는 것이 목표입니다.입력 예시입력 : A( -2, 8 ), B( -2, 0 ), C( 6,