이 문제에서는 하나의 숫자 N이 주어지며, 우리의 목표는 N보다 작은 모든 소수 삼중항(prime triplet)을 찾아 출력하는 것입니다.소수 삼중항이란?소수 삼중항은 세 개의 소수로 이루어진 집합으로, 다음 두 가지 형태 중 하나를 만족해야 합니다.(p, p+2, p+6)(p, p+4, p+6)모든 소수는 위와 같은 삼중항 형태로 그룹화할 수 있는데, 그 이유는 연속된 소수 패턴에서 세 번째마다 나오는 수가 항상 6의 배수이기 때문입니다. 즉, 3개의 연속한 홀수 중 하나는 반드시 3의 배수가 되어 소수일 수 없으므로, 소수 셋
연결 리스트(Linked List)가 주어졌을 때, 위치 m부터 n까지의 노드를 딱 한 번의 순회(one pass)만으로 뒤집는 문제를 살펴보겠습니다.예를 들어 리스트가 [1, 2, 3, 4, 5]이고 m = 2, n = 4라면, 2번째부터 4번째 노드만 역순으로 배치되어 결과는 [1, 4, 3, 2, 5]가 됩니다.알고리즘 접근 방식이 문제는 재귀(recursion)를 활용해 해결할 수 있습니다. 핵심 아이디어는 전체 리스트를 뒤집는 대신, 앞쪽 m-1개 노드는 그대로 두고 n개의 노드만 부분적으로 뒤집는 것입니다.구현에는 두 개
문제 개요이 문제에서는 하나의 문자열이 주어지며, 문자열을 구성하는 모든 문자의 ASCII 값의 합이 소수(prime number)인지 아닌지를 판별하여 그 결과를 YES / NO 형태로 출력해야 합니다.먼저 핵심 개념부터 간단히 정리해 보겠습니다.ASCII 값: 컴퓨터가 문자를 숫자로 표현하기 위해 사용하는 문자 인코딩 체계입니다. 예를 들어 영문 대문자 A는 65, 소문자 a는 97에 해당합니다.소수(Prime Number): 1과 자기 자신만을 약수로 가지는 수입니다. 즉, 2, 3, 5, 7, 11처럼 1보다 크면서 다른 수
이 문제에서는 하나의 숫자 N이 주어집니다. 우리의 목표는 이 숫자의 모든 프라임 포인트(prime point)를 찾아 출력하는 것이며, 만약 프라임 포인트가 하나도 존재하지 않는다면 -1을 출력해야 합니다. 프라임 포인트란 숫자를 특정 인덱스 위치에서 왼쪽과 오른쪽 두 부분으로 나누었을 때, 양쪽 숫자가 모두 소수(prime number)가 되도록 하는 인덱스 값을 말합니다. 구체적인 예시를 통해 문제를 이해해 보겠습니다. 입력: 2359 출력: 1 설명: 숫자 2359를 인덱스 1 위치에서 나누면 왼쪽은 2, 오른쪽은 59가
문제 개요하나의 숫자 n이 주어졌을 때, n보다 작거나 같은 숫자 중에서 소수이면서 동시에 피보나치 수인 모든 값을 출력하는 것이 이 문제의 목표입니다.예시입력: n = 30출력: 2 3 5 13설명: 30 미만의 피보나치 수는 1, 1, 2, 3, 5, 8, 13, 21입니다. 이 중에서 소수에 해당하는 숫자는 2, 3, 5, 13입니다.해결 접근 방법이 문제를 해결하려면 n 이하의 피보나치 수열을 구성하는 숫자들 각각이 소수인지 확인해야 합니다. 가장 효율적인 접근 방법은 다음 두 단계로 나눌 수 있습니다.소수 판별: 에라토스테
문제 소개 연결 리스트(Linked List)가 주어졌을 때, 이 리스트 안에 사이클(cycle), 즉 순환 구조가 존재하는지 판별하고, 존재한다면 사이클이 시작되는 노드를 찾아내는 것이 이 글의 목표입니다. 사이클의 위치는 정수형 변수 pos로 표현합니다. pos는 리스트의 꼬리(tail) 노드가 다시 연결되는 위치를 가리키며, pos = -1이면 사이클이 없음을 의미합니다. 예를 들어 연결 리스트가 [5, 3, 2, 0, -4, 7]이고 pos = 1이라면, 마지막 노드(값 7)가 두 번째 노드(값 3)에 연결되어 순환이 형성
이 문제에서는 세 가지 값, 즉 목표 합 S, 기준이 되는 소수 P, 그리고 필요한 소수의 개수 N이 주어집니다. 우리의 과제는 P보다 크면서 그 합이 정확히 S와 같은 N개의 소수 조합을 모두 찾는 것입니다.문제 예시입력: N = 2, P = 5, S = 18출력: 7 11설명: 5보다 큰 소수는 7, 11, 13이며,7 + 11 = 18이므로 7과 11이 조건을 만족합니다.해결 접근 방법이 문제를 해결하려면 먼저 P와 S 사이에 존재하는 모든 소수를 구해야 합니다. 그다음, 구한 소수들 중에서 합이 S가 되는 N개의 조합을 찾아
이진 트리가 하나 주어져 있고, 우리는 이 트리의 전위 순회(preorder traversal) 결과를 반환해야 합니다. 전위 순회란 루트 → 왼쪽 서브트리 → 오른쪽 서브트리 순서로 노드를 방문하는 순회 방식입니다.예를 들어 다음과 같은 트리가 있다고 가정해 보겠습니다.이 트리에 대한 전위 순회 결과는 다음과 같습니다.[3, 9, 20, 15, 7]해결 접근 방법이 문제는 재귀 호출 대신 스택(stack)을 활용한 반복(iterative) 방식으로 해결할 수 있습니다. 단계별 과정은 다음과 같습니다.결과를 저장할 빈 리스트 res
C++ 연결 리스트 삽입 정렬이란? 연결 리스트(linked list)가 주어졌을 때, 이 리스트를 삽입 정렬(Insertion Sort)로 오름차순 정렬하는 문제를 살펴보겠습니다. 예를 들어 리스트가 [9,45,23,71,80,55]라면, 정렬 결과는 [9,23,45,55,71,80]이 되어야 합니다. 배열과 달리 연결 리스트는 임의 접근(random access)이 불가능하지만, 노드의 삽입과 삭제가 포인터 조작만으로 O(1)에 가능하기 때문에 삽입 정렬과 특히 잘 어울리는 자료구조입니다. 알고리즘 접근 방법 삽입 정렬의 핵심
문제 개요이 문제에서는 두 정수 L과 R이 주어집니다. 목표는 L부터 R 사이에 있는 숫자들 중, 이진 표현에서 설정 비트(값이 1인 비트)의 개수가 소수인 숫자가 총 몇 개인지 구하는 것입니다.예제로 이해하기입력: L = 7, R = 12출력: 6각 숫자의 이진 표현과 설정 비트 개수를 살펴보면 다음과 같습니다.7 → 111 : 설정 비트 = 2개 → 소수 ✓8 → 1000 : 설정 비트 = 1개 → 소수 아님 ✗9 → 1001 : 설정 비트 = 2개 → 소수 ✓10 → 1010 : 설정 비트 = 2개 → 소수 ✓11 →
이 문제에서는 각 요소가 1 ≤ arr[i] ≤ 1012 범위에 있는 배열이 주어집니다. 우리의 목표는 배열의 모든 요소에 대한 최소공배수(LCM)의 모든 소인수를 출력하는 것입니다. 문제 이해하기 간단한 예제를 통해 문제를 살펴보겠습니다. 입력: array = {2 , 5 , 15} 출력: 2 3 5 설명: LCM = 30 30의 인수 = 2 × 3 × 5 배열 {2, 5, 15}의 최소공배수는 30이며, 30을 소인수분해하면 2 × 3 × 5가 됩니다. 따라서 정답은 2, 3, 5입니다. 접근 방법 가장 직관적인 방법은 먼저 배
정렬된 배열이 있고, 이 배열이 우리가 알지 못하는 어떤 피벗(pivot)을 기준으로 회전되었다고 가정해 봅시다. 이때 회전된 배열 안에서 최솟값을 찾아야 합니다. 예를 들어 배열이 [3,4,5,1,2]와 같다면 출력 결과는 1이 됩니다.문제 해결 접근 방법회전된 정렬 배열은 두 개의 정렬된 구간으로 나뉘어 있다는 특징이 있습니다. 따라서 처음부터 끝까지 모든 요소를 확인하는 선형 탐색(O(n)) 대신 이진 탐색(Binary Search)을 적용하면 O(log n)의 시간 복잡도로 훨씬 효율적으로 최솟값을 구할 수 있습니다.핵심 아
이 문제에서는 최대 1018까지의 매우 큰 정수 N이 주어집니다. 우리가 해야 할 일은 이 수를 구성하는 모든 소인수(prime factor)와 각 소인수가 등장하는 빈도를 함께 출력하는 것입니다.먼저 예제를 통해 문제를 이해해 보겠습니다.입력: 100 출력: 2 2 5 2 설명: 100 = 2 × 2 × 5 × 5 이므로, 소인수 2는 2번, 소인수 5는 2번 등장합니다.문제 해결 접근 방식이 문제를 해결하려면 주어진 수의 소인수들을 찾은 뒤, 각 소인수가 몇 번 곱해졌는지(빈도)를 계산해야 합니다. 알고리즘은 다음과
소인수(Prime Factor)란 주어진 수의 인수 중에서 소수에 해당하는 수를 말합니다. 약수(Factor)는 곱셈을 통해 주어진 수를 만들 수 있는 수들을 의미합니다. 소인수분해(Prime Factorisation)는 주어진 수를 소인수들로 반복해서 나누어 해당 수의 모든 소인수를 찾아내는 과정입니다. 예시 : N = 120 소인수 = 2 5 3 인수분해 : 2 * 2 * 2 * 3 * 5 소인수의 핵심 특징 어떤 수의 소인수 집합은 항상 유일합니다. 소인수분해는 배수 관계 판별, 공통 분모 찾기 등 다양한 수학적 계산에서
문제 개요이 문제에서는 하나의 숫자 N이 주어지며, 우리의 과제는 이 숫자의 홀수 자리(odd place)에 있는 자릿수들의 합이 소수(prime number)인지 아닌지를 확인하는 것입니다.소수 판별(Primality Test)이란 주어진 수가 소수인지 아닌지를 검사하기 위해 사용되는 알고리즘을 말합니다.자릿수의 위치는 가장 오른쪽 자리부터 1번째로 세기 시작합니다. 예를 들어 3425에서 5는 1번째(홀수), 2는 2번째(짝수), 4는 3번째(홀수), 3은 4번째(짝수) 자리에 해당합니다.예제로 문제 이해하기입력: 3425출력:
소수성 테스트란 무엇인가? 이 문제에서는 숫자 N이 주어졌을 때, 해당 숫자가 소수인지 아닌지를 판별하는 것이 목표입니다. 소수성 테스트(Primality Test)는 주어진 숫자가 소수인지 여부를 확인하기 위해 사용되는 알고리즘을 말합니다. 소수(Prime Number)란 1과 자기 자신으로만 나누어 떨어지는 수를 의미합니다. 예를 들어 2, 3, 5, 7 등이 있습니다. 간단한 예시를 통해 문제를 살펴보겠습니다. 입력: 11 출력: Yes 방법 1: 나눗셈을 이용한 기본 접근 숫자의 소수 여부를 확인하는 방법은 여러 가지가 있
프림(Prim) 알고리즘 개요프림(Prim) 알고리즘은 주어진 가중치 무방향 그래프에서 최소 신장 트리(Minimum Spanning Tree, MST)를 찾기 위해 사용되는 대표적인 그리디(Greedy) 기반 알고리즘입니다. 하나의 시작 정점에서 출발하여, 트리에 속한 정점과 속하지 않은 정점을 잇는 간선 중 가장 가중치가 낮은 것을 반복적으로 추가하며 트리를 확장해 나갑니다.핵심 용어 정리가중치 그래프(Weighted Graph) — 모든 간선에 가중치(비용) 값이 부여된 그래프입니다.무방향 그래프(Undirected Graph
이 문제에서는 하나의 정수 n이 주어집니다. 우리가 해야 할 일은 숫자의 이진 표현에서 설정된(set) 비트 단 하나를 변경하여 만들 수 있는 수 중에서 n보다 작은 가장 큰 수를 출력하는 것입니다.문제 이해하기예시를 통해 문제를 자세히 살펴보겠습니다.입력: n = 3 출력: 2 설명: (3)₁₀ = (011)₂ 설정된 비트 하나를 뒤집으면 001과 010을 얻을 수 있으며, 이 중 더 큰 값은 010, 즉 2입니다.해결 접근 방법이 문제를 해결하는 핵심은 가장 오른쪽에 있는 설정된 비트(최하위 설정 비트)를 찾아 0으로 바꾸는 것
문제 소개 이 문제에서는 하나의 정수 n이 주어집니다. 우리가 해야 할 일은 n보다 1 작은 수, 즉 바로 앞의 숫자가 n의 1의 보수(1s complement)와 동일한지 확인하는 것입니다. 몇 가지 예시를 통해 문제를 이해해 보겠습니다. 입력: 12 출력: No 설명: (12)10 = (1100)2 바로 앞의 숫자 11 = (1011)2 12의 1의 보수 = (0011)2 입력: 4 출력: Yes 설명: 4 = (100)2 바로 앞의 숫자 3 = (011)2 4의 1의 보수 = (011)2 단순한 접근 방법 가장 직관적인 방
문제 개요이 문제에서는 하나의 배열이 주어지며, 우리의 과제는 배열에서 현재 요소보다 앞쪽(왼쪽)에 위치하면서 더 큰 값을 찾아 출력하는 것입니다. 만약 그런 요소가 존재하지 않는다면 -1을 출력해야 합니다.예시를 통해 문제를 자세히 살펴보겠습니다.입력: {6, 2, 7, 1, 5, 3} 출력: -1, 6, -1, 7, 7, 7각 요소별 결과를 분석하면 다음과 같습니다.6: 배열의 첫 번째 요소이므로 앞에 비교할 요소가 없음 → -12: 앞쪽에서 더 큰 요소는 6 → 67: 앞쪽에 더 큰 요소가 없음 → -11: 앞쪽에서 가장 먼저