0보다 큰 수를 자연수라고 합니다. 자연수는 다음과 같이 1부터 시작하여 무한히 이어지는 양의 정수입니다.1, 2, 3, 4, 5, 6, 7...알고리즘C++에서 자연수를 출력하는 절차는 다음과 같습니다.출력할 자연수의 개수 n을 초기화합니다.1부터 n까지 반복하는 루프를 작성합니다.현재 숫자를 출력합니다.반복 변수를 1씩 증가시킵니다.구현다음은 위 알고리즘을 C++로 구현한 코드입니다.#include <bits/stdc++.h> using namespace std; void printNaturalNumbers(int
문제 소개0과 1로만 구성된 이진 행렬(binary matrix)이 주어졌을 때, 행렬의 모든 칸에 대해 그 칸에서 가장 가까운 1이 위치한 칸까지의 최소 거리를 구하는 것이 이번 글의 목표입니다.여기서 말하는 거리는 맨해튼 거리(Manhattan Distance)를 의미합니다. 현재 칸의 좌표를 (i, j), 목표 칸의 좌표를 (k, l)이라 할 때 거리는 다음과 같이 정의됩니다.distance = |i - k| + |j - l|구체적인 예제를 통해 살펴보겠습니다.입력0 0 11 1 00 0 0출력1 1 00 0 11 1 2위 결
숫자 n이 주어졌을 때, n보다 작은 수 중에서 가장 가까운 소수를 찾아야 합니다. 이 문제는 n - 1부터 차례대로 검사를 시작하면 아주 간단하게 해결할 수 있습니다. 예시를 통해 살펴보겠습니다.입력10출력7알고리즘숫자 n을 초기화합니다.n - 1부터 1까지 반복하는 루프를 작성합니다.발견된 첫 번째 소수를 즉시 반환합니다.주어진 n보다 작은 소수를 찾지 못했다면 -1을 반환합니다.구현다음은 위 알고리즘을 C++로 구현한 코드입니다.#include <bits/stdc++.h> using namespace std; boo
네온 숫자(Neon Number)란 어떤 수를 제곱했을 때, 그 결과값의 각 자릿수를 모두 더한 합이 원래의 수와 같아지는 수를 말합니다. 간단한 예시로 살펴보겠습니다.n = 9제곱값 = 81제곱값의 자릿수 합 = 8 + 1 = 9자릿수 합이 원래 수인 9와 같으므로, 9는 네온 숫자입니다.참고로 10진수에서 네온 숫자는 0, 1, 9 단 세 개뿐이라는 점도 흥미롭습니다.이번 글에서는 주어진 수가 네온 숫자인지 판별하는 프로그램을 만들어 보겠습니다. 네온 숫자라면 Yes를, 아니라면 No를 출력하면 됩니다.알고리즘판별할 수 n을 초
네스빗의 부등식이란?네스빗의 부등식(Nesbitts Inequality)은 다음과 같이 표현되는 잘 알려진 수학적 부등식입니다.a/(b + c) + b/(c + a) + c/(a + b) ≥ 1.5 (단, a > 0, b > 0, c > 0)양수 세 개가 주어졌을 때, 이 세 수가 네스빗의 부등식을 만족하는지 확인해야 하는 상황을 생각해 볼 수 있습니다. 로직 자체는 매우 단순하기 때문에 비교적 쉽게 프로그램으로 구현할 수 있습니다.참고로 네스빗의 부등식은 모든 양수 조합에 대해 수학적으로 항상 성립하는 정리이지만,
Newman-Shanks-Williams(NSW) 수열은 1981년 모리스 뉴먼(Morris Newman), 대니얼 섕크스(Daniel Shanks), 휴 윌리엄스(Hugh C. Williams)가 연구하면서 소개된 수열로, 그중 소수에 해당하는 항들을 NSW 소수라고 부릅니다. 이 수열은 다음과 같습니다.1, 1, 3, 7, 17, 41...이 수열을 일반화하면 아래와 같은 점화식으로 표현할 수 있습니다.a0=1a1=1an=2*a(n-1)+a(n-2)알고리즘구하고자 하는 항의 번호 n을 초기화합니다.수열의 첫 두 항인 1과 1로
다음 큰 요소란 무엇인가?다음 큰 요소(Next Greater Element)란 배열에서 현재 요소의 오른쪽에 있는 값들 중, 처음으로 현재 요소보다 큰 값을 가지는 요소를 의미합니다. 만약 오른쪽에 더 큰 요소가 존재하지 않는다면 -1로 표시합니다.간단한 예제를 통해 살펴보겠습니다.arr = [4, 5, 3, 2, 1]위 배열에서 4의 다음 큰 요소는 바로 옆에 있는 5입니다. 반면 3, 2, 1은 뒤에 자신보다 큰 요소가 없으므로 각각 -1이 됩니다.알고리즘이 문제는 스택(Stack)을 활용하면 효율적으로 해결할 수 있습니다.
다음 큰 요소(Next Greater Element)란 특정 요소 뒤에서 처음으로 등장하는, 그 요소보다 큰 값을 가진 요소를 의미합니다. 만약 뒤쪽에 더 큰 요소가 존재하지 않는다면 -1로 표시합니다. 간단한 예시를 통해 살펴보겠습니다. arr = [4, 5, 3, 2, 1] 4의 다음 큰 요소는 5입니다. 3, 2, 1의 경우 뒤에 더 큰 요소가 없으므로 -1이 됩니다. 알고리즘 개요 이 문제는 스택(Stack) 자료구조를 활용하면 효율적으로 해결할 수 있습니다. 알고리즘의 진행 순서는 다음과 같습니다. 배열을 임의의 숫자
문제 개요하나의 정수 n이 주어졌을 때, n보다 크면서 이진수 표현에서 세트 비트(set bit)의 개수가 정확히 하나 더 많은 수를 찾는 것이 이 글의 목표입니다.여기서 세트 비트란 이진수 표현에서 값이 1인 비트를 의미합니다.예시입력:124출력:125124의 이진 표현은 1111100으로 세트 비트가 5개입니다. 바로 다음 수인 125는 1111101로 세트 비트가 6개, 즉 하나 더 많으므로 정답이 됩니다.알고리즘숫자 n을 초기화합니다.세트 비트의 개수를 세는 함수를 작성합니다.반복 변수를 n + 1로 초기화합니다.무한 루프를
N, A, B 세 값이 주어졌을 때, N보다 크면서 숫자 A와 B가 정확히 같은 개수만큼 포함된 수를 찾는 문제입니다. 먼저 예시를 살펴보겠습니다.N = 1234 A = 2 B = 3이 예시의 정답은 2233입니다. 2233은 1234보다 크고, 숫자 2와 3이 각각 두 번씩 등장하므로 두 숫자의 개수가 동일하기 때문입니다.이 문제는 가능한 모든 자릿수 조합을 확인해야 합니다. 수를 구성할 수 있는 숫자는 A와 B 두 가지뿐이며, 완성된 수 안에서 각 숫자의 등장 횟수는 반드시 같아야 합니다.알고리즘A, B, N을 초기화합니다.재귀
문제 소개 숫자 n이 주어졌을 때, 임의의 두 자릿수를 딱 한 번 교환(swap)하여 원래 수보다 더 큰 수를 만들어야 합니다. 만약 어떤 방법으로도 더 큰 수를 만들 수 없다면 -1을 출력합니다. 먼저 예시를 살펴보겠습니다. 입력 12345 출력 12354 위 예제에서는 4와 5의 자리를 서로 바꾸었습니다. 이처럼 단 한 번의 스왑만으로 원래 수보다 큰 12354를 얻을 수 있습니다. 알고리즘 접근 방식 핵심 아이디어는 다음과 같습니다. 모든 자릿수가 내림차순으로 배열되어 있다면(예: 54321) 어떤 두 자릿수를 교환해도
문제 소개숫자 n이 주어졌을 때, n보다 크면서 이진수 표현상 세트 비트(set bit)의 개수가 n과 동일한 수를 찾는 것이 목표입니다.여기서 세트 비트란 이진수 표현에서 값이 1인 비트를 의미합니다. 예를 들어, 124의 이진수 표현은 1111100이며, 세트 비트의 개수는 5개입니다.간단한 예시를 통해 문제를 확인해 보겠습니다.입력124출력143143의 이진수 표현은 10001111로, 역시 세트 비트가 5개입니다. 즉, 124보다 크면서 세트 비트 개수가 같은 가장 작은 수가 143입니다.알고리즘숫자 n을 초기화합니다.주어진
N-ary 트리(n-ary tree)는 각 노드가 최대 n개의 자식 노드를 가질 수 있는 트리 구조입니다. 이번 글에서는 하나의 숫자 x가 주어졌을 때, N-ary 트리 전체를 탐색하여 x보다 크면서 가장 작은 값, 즉 다음으로 큰 요소(next greater element)를 찾는 방법을 알아보겠습니다. 이 문제는 트리를 순회하면서 조건에 맞는 후보 값을 계속 갱신해 나가는 방식으로 해결할 수 있습니다. 알고리즘 N-ary 트리를 생성합니다. 결과값을 저장할 변수를 초기화합니다. 다음으로 큰 요소를 찾는 재귀 함수를 작성합니다.
다음 작은 요소(Next Smaller Element)란 어떤 요소 뒤에서 처음으로 등장하는 더 작은 값을 의미합니다. 예시를 통해 살펴보겠습니다.arr = [1, 2, 3, 5, 4]위 배열에서 5의 다음 작은 요소는 바로 뒤에 있는 4입니다. 반면 1, 2, 3은 자신보다 작은 값이 뒤에 존재하지 않으므로 다음 작은 요소는 -1이 됩니다.알고리즘배열을 임의의 숫자로 초기화합니다.스택을 하나 생성합니다.배열의 첫 번째 요소를 스택에 넣습니다(push).배열의 나머지 요소들을 순서대로 순회합니다.스택이 비어 있다면 현재 요소를 스택
숫자 N이 주어졌을 때, N보다 큰 수 중에서 소수이면서 동시에 회문(palindrome)인 가장 작은 수를 찾는 것이 목표입니다. 회문이란 앞에서 읽으나 뒤에서 읽으나 같은 수를 의미합니다. 예시를 통해 살펴보겠습니다. 입력 N = 10 출력 11 11은 소수이면서 회문이기도 하므로, 10보다 큰 첫 번째 소수 회문입니다. 알고리즘 숫자 N을 초기화합니다. 주어진 수가 소수인지 판별하는 함수를 작성합니다. 주어진 수가 회문인지 판별하는 함수를 작성합니다. N + 1부터 시작하여 다음 소수 회문을 찾을 때까지 반복하는 루프를 작
배열이 주어졌을 때, 그중 가장 자주 등장하는 요소(최빈값)를 찾아야 하는 문제는 코딩 테스트와 실무에서 자주 만나게 되는 기본적인 알고리즘 문제입니다. 먼저 간단한 예시를 통해 문제를 이해해 보겠습니다.문제 예시입력arr = [1, 2, 3, 3, 2, 2, 1, 1, 2, 3, 4]출력2위 배열에서 숫자 2는 총 4번 등장하며, 다른 어떤 요소보다도 많이 나타납니다. 따라서 정답은 2입니다.알고리즘 1 — 해시 맵(Map) 활용배열을 초기화합니다.각 요소의 빈도를 저장할 맵(unordered_map)을 준비합니다.배열을 한 번
모츠킨 수(Motzkin Number)란?모츠킨 수는 조합론에서 다루는 대표적인 수열로, 원 위에 배치한 n개의 점을 서로 교차하지 않는 현(chord)으로 연결하는 방법의 수를 의미합니다. 격자 경로(lattice path)의 개수를 셀 때에도 활용되며, 수학과 컴퓨터 과학 전반에서 자주 등장하는 개념입니다.모츠킨 수열은 다음과 같이 시작합니다.M0 = 1M1 = 1M2 = 2M3 = 4M4 = 9M5 = 21M6 = 51 …n번째 일반항은 아래 점화식을 통해 구할 수 있습니다.Mn = ((2n + 1) × M(n-1) + (3n
여러 개의 0이 포함된 배열이 주어졌을 때, 배열에 있는 모든 0을 배열의 끝으로 이동해야 합니다. 예시를 통해 자세히 살펴보겠습니다. 입력 arr = [4, 5, 0, 3, 2, 0, 0, 0, 5, 0, 1] 출력 4 5 3 2 5 1 0 0 0 0 0 알고리즘 배열을 초기화합니다. 인덱스 변수를 0으로 초기화합니다. 주어진 배열을 처음부터 끝까지 순회합니다. 현재 요소가 0이 아니라면, 해당 인덱스 위치에 현재 요소의 값을 저장합니다. 인덱스를 1 증가시킵니다. 위에서 갱신된 인덱스부터 n까지 반복하는 루프를 작성합니다
이 튜토리얼에서는 배열 안의 모든 0은 앞쪽으로, 1은 뒤쪽으로 이동시키는 프로그램을 C++로 작성해 보겠습니다.문제는 다음과 같습니다. 0과 1이 섞여 있는 임의의 정수 배열이 주어졌을 때, 모든 0은 배열의 시작 부분으로, 모든 1은 배열의 끝 부분으로 이동해야 합니다. 나머지 숫자들은 원래 순서를 유지한 채 가운데에 배치됩니다.예를 들어 살펴보겠습니다.입력arr = [4, 5, 1, 1, 0, 0, 2, 0, 3, 1, 0, 1]출력0 0 0 0 4 5 2 3 1 1 1 1알고리즘핵심 아이디어는 두 단계로 나누어 처리하는 것입
정수와 0이 무작위로 섞여 있는 연결 리스트가 주어졌을 때, 리스트에 포함된 모든 0을 앞쪽으로 이동시키는 것이 이번 문제의 목표입니다. 먼저 예시를 통해 문제를 살펴보겠습니다.입력3 -> 0 -> 1 -> 0 -> 0 -> 1 -> 0 -> 0 -> 3 -> NULL출력0 -> 0 -> 0 -> 0 -> 0 -> 3 -> 1 -> 1 -> 3 -> NULL출력 결과를 보면 0이 아닌 노드들의 상대적인 순서는 그대로 유지되면서, 모든 0