문제 개요이 문제에서는 하나의 정수 n이 주어지며, n부터 시작해 값이 0 또는 음수에 도달할 때까지 감소한 뒤, 다시 원래의 n까지 증가하는 수열 패턴을 출력하는 것이 목표입니다.예를 들어 문제를 이해해 보겠습니다.입력: n = 12출력: 12 7 2 -3 2 7 12접근 방법for나 while 같은 반복문을 사용하지 않고 재귀(recursion)를 활용해 이 문제를 해결할 수 있습니다. 핵심 아이디어는 다음과 같습니다.현재 값이 양수(m > 0)인 동안에는 값을 출력하고, 5를 뺀 값으로 재귀 호출을 이어갑니다.재귀 호출이
문제 개요이 문제에서는 하나의 숫자 n이 주어지며, 우리의 목표는 n보다 작으면서 모든 자릿수가 중복 없이 서로 다른 숫자를 만족하는 가장 큰 수를 찾아 출력하는 것입니다.예시를 통해 문제를 이해해 보겠습니다.입력: n = 2332출력: 2319위 예시에서 2332보다 작은 수 중 자릿수가 모두 다른 가장 큰 수는 2319입니다. (2321은 2가 두 번 나타나므로 조건을 만족하지 않습니다.)접근 방법이 문제를 해결하는 가장 직관적인 방법은 n부터 0까지 역순으로 숫자를 검사하는 것입니다. 각 숫자에 대해 다음 과정을 수행합니다.현
문제 개요이 문제에서는 두 개의 값 K와 D가 주어집니다. 우리의 과제는 K자리 숫자를 출력하되, 그 숫자의 디지털 루트(digital root)가 정확히 D가 되도록 만드는 것입니다.디지털 루트란 숫자의 각 자릿수를 계속해서 더해 나가, 마침내 한 자리 숫자가 될 때까지 반복했을 때 얻어지는 최종 값을 의미합니다. 디지털 합(digital sum)이라고도 불립니다.예시를 통해 문제를 살펴보겠습니다.입력: D = 5, K = 6 출력: 500000즉, 6자리 숫자이면서 각 자릿수의 합을 반복적으로 더했을 때 5가 되는 수를 찾으면
이 문제에서는 하나의 행렬이 주어지며, 우리의 과제는 이 행렬을 역파형(reverse waveform) 형태로 한 줄에 출력하는 것입니다.예시를 통해 문제를 더 명확하게 이해해 보겠습니다.입력: 1 4 6 11 2 5 8 54 7 9 3 43 1 7 4 34출력: 11 54 43 34 4 3 8 6 4 5 9 7 1 7 2 1문제 해결 접근 방법이 문제를 해결하려면 행렬의 역파형을 출력해야 합니다. 그 방법은 다음과 같습니다.먼저 마지막 열의 요소들을 위에서 아래 방향(내림차순)으로 출력합니다.그다음 뒤에서 두
이 문제에서는 2차원 배열(행렬)이 주어지며, 모든 요소를 특정 규칙에 따라 순서대로 출력해야 합니다. 규칙은 다음과 같습니다. 첫 번째 행은 왼쪽에서 오른쪽으로, 두 번째 행은 오른쪽에서 왼쪽으로, 세 번째 행은 다시 왼쪽에서 오른쪽으로 출력하는 식으로 행마다 방향을 번갈아 가며 진행합니다.문제 예시예제를 통해 문제를 더 쉽게 이해해 보겠습니다.입력: array = { {2, 5} {4, 9} } 출력: 2 5 9 4위 예시를 보면, 첫 번째 행의 {2, 5}는 왼쪽에서 오른쪽으로 그대로 출력되고, 두 번째 행의 {
문제 개요이 문제에서는 하나의 2차원 행렬과 한 점 P(c, r)가 주어집니다. 목표는 주어진 점 P에서 출발하여 행렬의 모든 요소를 반시계 방향으로 나선형(spiral)으로 탐색하며 출력하는 것입니다.예제예시를 통해 문제를 더 쉽게 이해해 보겠습니다.입력: matrix[][] = {{1, 4, 7}, {2, 5, 8}, {3, 6, 9}} 시작점 P = (0행, 2열) 출력: 7 8 5 4 9 6 3 2 1위 예제에서 시작점은 값 7이 있는 위치입니다. 이 지점에서 출발해 왼쪽
이 문제에서는 2차원 행렬이 주어지며, 우리가 해야 할 일은 이 행렬의 요소들을 지그재그(ZigZag) 형태로 출력하는 것입니다.예시를 통해 문제를 살펴보겠습니다.입력: 12 99 43 10 82 50 15 75 5출력: 12 99 43 50 82 10 15 75 5문제 해결 접근 방법이 문제를 해결하는 핵심 아이디어는 다음과 같습니다.짝수 번째 행(0, 2, 4...): 왼쪽에서 오른쪽(LtoR) 방향으로 요소를 출력합니다.홀수 번째 행(1
이 문제에서는 2차원 행렬이 주어지며, 우리의 목표는 행렬의 모든 요소를 역 나선(reverse spiral) 형태로 출력하는 것입니다.문제 이해하기먼저 예시를 통해 문제를 살펴보겠습니다.입력: 12 23 54 67 76 90 01 51 43 18 49 5 31 91 75 9출력: 18 49 1 90 76 43 31 91 75 9 5 51 67 54 23 12출력 결과를
이 문제에서는 2차원 행렬이 주어지며, 우리의 목표는 행렬의 모든 요소를 시계 반대 방향 나선형(counterclockwise spiral) 순서로 출력하는 것입니다.시계 반대 방향 나선형이란?시계 반대 방향 나선형 탐색은 행렬의 왼쪽 위(첫 번째 행, 첫 번째 열)에서 시작하여 아래 → 오른쪽 → 위 → 왼쪽 순서로 방향을 바꿔가며, 외곽에서부터 안쪽으로 나선을 그리듯 이동하는 방식입니다.예를 들어 다음과 같은 4×4 행렬이 있을 때,1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
문제 개요이 문제에서는 하나의 문자열이 주어지며, 우리의 과제는 현재 문자열과 가장 가까우면서(즉, 변경 횟수가 최소인) 인접한 중복 문자를 하나도 포함하지 않는 문자열을 출력하는 것입니다.예시를 통해 문제를 이해해 보겠습니다.입력: string = good 출력: goad위 예시에서 인덱스 1과 2의 문자가 서로 같으므로(o, o), 인덱스 2의 문자를 변경하여 goad를 얻습니다.접근 방법이 문제는 그리디(Greedy) 알고리즘으로 해결할 수 있습니다. 문자열을 처음부터 끝까지 순회하면서 다음 과정을 수행합니다. 문자열을 순회하
이 문제에서는 하나의 정렬 알고리즘과 숫자 n이 주어집니다. 우리의 과제는 이 알고리즘이 정렬에 실패하는 n개의 요소를 가진 배열을 출력하는 것입니다. 즉, 해당 알고리즘이 올바르게 동작하지 않는 반례를 찾아야 합니다.알고리즘 분석 a[i+1] swap(a[i], a[j+1])먼저 이 정렬 알고리즘을 자세히 살펴보겠습니다. 이 알고리즘은 두 개의 중첩 루프를 사용합니다. 외부 루프는 1부터 n-1까지 순회하고, 내부 루프는 i부터 n-1까지 순회하면서 각 반복마다 내부 루프의 요소와 외부 루프의 요소 값을 비교하여 순
각 노드가 정수 값을 가지는 이진 트리가 주어졌다고 가정해 봅시다. 우리가 해야 할 일은 노드 값의 합이 주어진 목표 값과 같아지는 루트에서 리프까지의 경로를 모두 찾는 것입니다.예를 들어 트리가 [5,4,8,11,null,13,4,7,2,null,null,5,1]과 같이 구성되어 있고, 목표 합(sum)이 22라면 다음 그림과 같습니다.이때 조건을 만족하는 경로는 [[5,4,11,2],[5,8,4,5]] 두 가지입니다.풀이 접근 방식: DFS(깊이 우선 탐색)이 문제는 약간 변형된 DFS(깊이 우선 탐색) 함수를 사용하면 깔끔하게
두 개의 이진 트리 병합이란?두 개의 이진 트리가 있고, 그중 하나를 다른 트리 위에 겹쳐 올린다고 가정해 봅시다. 이때 일부 노드는 서로 겹치게 되고, 나머지 노드는 겹치지 않습니다. 우리의 목표는 이 두 트리를 하나의 새로운 이진 트리로 병합하는 것입니다.병합 규칙은 다음과 같습니다.두 노드가 겹치는 경우: 두 노드의 값을 더한 합을 병합된 노드의 새로운 값으로 사용합니다.한쪽 노드만 존재하는 경우: 값이 있는(null이 아닌) 노드를 그대로 새 트리의 노드로 사용합니다.예를 들어 아래와 같은 두 트리가 있다면 −병합
문제 설명여러 개의 칩이 놓여 있고, i번째 칩은 현재 chips[i] 위치에 있다고 가정해 봅시다. 각 칩에 대해 다음 두 가지 연산을 원하는 만큼(0회 포함) 반복해서 수행할 수 있습니다.i번째 칩을 왼쪽 또는 오른쪽으로 2칸 이동한다. 이때 비용은 0입니다.i번째 칩을 왼쪽 또는 오른쪽으로 1칸 이동한다. 이때 비용은 1입니다.처음에 주어지는 칩은 두 개 이상입니다. 모든 칩을 같은 위치로 모으는 데 필요한 최소 비용을 구해야 하며, 최종 위치는 어디든 상관없습니다. 예를 들어 초기 칩 배열이 [2,2,2,3,3]이라면 출력은
크기가 m x n인 2차원 그리드와 정수 k가 주어졌을 때, 그리드를 k번 시프트(이동)해야 하는 문제를 생각해 봅시다. 시프트 연산은 다음 규칙에 따라 수행됩니다.그리드의 요소 G[i, j]는 G[i, j + 1] 위치로 이동합니다.각 행의 마지막 요소 G[i, n – 1]은 다음 행의 첫 번째 위치 G[i + 1, 0]으로 이동합니다.그리드의 마지막 요소 G[m - 1, n – 1]은 첫 번째 위치 G[0, 0]으로 이동합니다.예를 들어 그리드가 다음과 같다고 가정해 보겠습니다.123456789한 번 시프트를 수행하면 결과는 다
단일 연결 리스트(singly-linked list)의 첫 번째 노드를 가리키는 head 포인터가 있다고 가정해 봅시다. 연결 리스트에 있는 각 노드의 값은 0 또는 1이며, 이 연결 리스트는 어떤 숫자의 이진수 표현을 저장하고 있습니다. 우리가 해야 할 일은 연결 리스트에 담긴 이진수를 십진수 값으로 변환하여 반환하는 것입니다. 예를 들어 리스트가 [1,0,1,1,0,1]과 같다면 결과는 45가 됩니다.문제 해결 접근 방식이 문제는 다음 단계를 따라 해결할 수 있습니다.연결 리스트의 각 노드 값을 배열(vector)로 변환합니다.
2-3 트리란 무엇인가?2-3 트리(2-3 Tree)는 균형 잡힌 트리 데이터 구조의 한 종류로, 자식을 가지는 모든 내부 노드(internal node)가 다음 두 형태 중 하나를 만족해야 합니다.2-노드(2-node): 하나의 데이터 요소와 두 개의 자식 노드를 가짐3-노드(3-node): 두 개의 데이터 요소와 세 개의 자식 노드를 가짐기본 정의내부 노드가 하나의 데이터 요소와 두 개의 자식을 가지면 이를 2-노드라고 부릅니다.내부 노드가 두 개의 데이터 요소와 세 개의 자식을 가지면 이를 3-노드라고 부릅니다.트리 T가 다음
2-SAT 문제란?2-SAT(2-만족도, 2-Satisfiability) 문제는 각 절(clause)이 정확히 두 개의 리터럴로 구성된 부울 논리식이 참(true)이 되도록 변수에 값을 배정할 수 있는지를 판단하는 고전적인 알고리즘 문제입니다. 다음 형태의 논리식 f를 생각해 보겠습니다.f = (x1 ∨ y1) ∧ (x2 ∨ y2) ∧ ... ∧ (xn ∨ yn)문제는 단순합니다. "f를 만족시키는 변수 값의 조합이 존재하는가?"절을 함축 명제로 바꾸기핵심 아이디어는 논리학의
병합 정렬(Merge Sort)은 배열을 재귀적으로 두 부분으로 나눈 뒤 각각을 정렬하고, 마지막에 하나로 합치는 대표적인 분할 정복(Divide and Conquer) 알고리즘입니다. 그 변형인 3-way 병합 정렬(3-way Merge Sort)은 배열을 두 부분이 아닌 세 부분으로 나눈다는 점에서 차별화됩니다.일반적인 병합 정렬이 배열을 절반 크기의 하위 배열로 계속 쪼개는 방식이라면, 3-way 병합 정렬은 같은 원리로 배열을 1/3 크기의 하위 배열로 나누어 처리합니다.동작 원리3-way 병합 정렬은 다음 단계로 진행됩니다
프로그래밍을 하다 보면 함수가 반환한 값을 확인하고, 그 값에 따라 조건부로 다른 동작을 수행해야 하는 경우가 매우 흔합니다. 전통적인 방식으로는 아래와 같이 코드를 작성하게 됩니다.// 어떤 메서드 또는 함수 return_type foo(Params); // Params로 함수를 호출하고 // 반환값을 var1에 저장 auto var1 = foo(Params); if (var1 == /* some value */) { // 무언가 수행 } else { // 다른 작업 수행 }일반적인 if-else 구조일반적인 조건