알파벳과 숫자가 섞여 있는 문자열이 있다고 가정해 봅시다. 이때 문자열에 포함된 각 알파벳을 대문자 또는 소문자로 변환하여 만들 수 있는 모든 가능한 조합(순열)을 생성해야 합니다. 만약 문자열에 숫자만 포함되어 있다면, 원본 문자열 그대로를 반환하면 됩니다. 예를 들어 입력 문자열이 1ab2라면, 결과는 다음과 같습니다. [1ab2, 1Ab2, 1aB2, 1AB2] 문제 접근 방법 이 문제는 재귀(recursion) 기법으로 효과적으로 해결할 수 있습니다. 핵심 아이디어는 다음과 같습니다. 재귀 함수는 현재 처리할 위치를 나타
키보드로 이름을 입력하다 보면 실수로 특정 키를 오래 누르는 경우가 있습니다. 이럴 때 같은 문자가 하나 이상 추가로 입력되곤 하죠. 이번 글에서는 두 개의 문자열을 받아, 두 번째 문자열이 첫 번째 이름을 길게 눌러(long-pressed) 입력한 결과인지 확인하는 방법을 알아보겠습니다.예를 들어 원래 이름이 Amit이고 입력된 문자열이 Ammittt라면, m과 t가 여러 번 반복되었으므로 길게 눌린 이름입니다. 반면 Ammttt는 중간에 문자 i가 빠져 있기 때문에 길게 눌린 이름이 아닙니다.해결 접근 방법두 포인터(two po
문제 개요2N명의 사람이 있다고 가정해 봅시다. 어떤 회사가 면접을 진행하려고 하는데, i번째 사람을 도시 A로 보내는 비행 비용은 costs[i][0], 도시 B로 보내는 비용은 costs[i][1]입니다. 우리는 각 도시에 정확히 N명씩 도착하도록 모든 사람을 이동시키는 최소 총비용을 구해야 합니다.예를 들어 입력 리스트가 [[10, 20], [30, 200], [400, 50], [30, 20]]이라면 출력은 110이 됩니다. 첫 번째 사람은 비용 10으로 도시 A에, 두 번째 사람은 비용 30으로 도시 A에 보내고, 세 번째
C++의 proj() 함수는 복소수에 대한 리만 구(Riemann sphere) 투영(projection)을 수행하는 함수입니다. 이 글에서는 proj() 함수의 기본 문법과 동작 원리를 예제 코드와 함께 자세히 알아보겠습니다. proj() 함수 문법 proj() 함수는 <complex> 헤더에 정의되어 있으며, 다음과 같은 템플릿 형태로 선언됩니다. template <class T> complex<T> proj (const complex<T>& z); proj() 함수의 동작
이 글에서는 C++ 프로그래밍의 재귀(Recursion) 기법을 활용하여 피라미드 모양의 패턴을 출력하는 방법을 알아봅니다. 반복문(for, while)을 사용하지 않고 오직 재귀 호출만으로 공백과 # 문자를 조합해 피라미드를 완성할 수 있습니다.알고리즘피라미드 패턴을 출력하기 위한 전체적인 절차는 다음과 같습니다.1단계: 피라미드의 높이(n)를 설정한다2단계: 재귀 함수를 이용해 공백을 출력한다3단계: 재귀 함수를 이용해 # 문자를 출력한다4단계: 두 함수를 함께 호출하여 피라미드 패턴을 완성한다구현 예제위 알고리즘에 따라 작성한
C++ 프로그래밍을 활용하면 반복문과 조건문만으로도 다양한 모양의 패턴을 화면에 출력할 수 있습니다. 이번 글에서는 위아래가 대칭을 이루는 흥미로운 별(*) 패턴을 출력하는 방법을 알고리즘과 실제 코드 예제를 통해 단계별로 살펴보겠습니다.알고리즘패턴을 출력하기 위한 전체적인 절차는 다음과 같습니다.1단계: 패턴의 크기(n)를 정의한다. 실제 출력 시 크기는 자동으로 두 배가 된다 2단계: 반복문을 사용하여 패턴의 윗부분(상단)을 출력한다 3단계: 반복문을 사용하여 패턴의 아랫부분(하단)을 출력한다예제 코드위 알고리즘을 바탕으로 작성
이 글에서는 C++ 프로그래밍 언어를 사용하여 @ 문자로 구성된 반쪽 피라미드(half-pyramid) 패턴을 출력하는 방법을 알아봅니다. 중첩 반복문(nested loop)의 기본 원리를 익히기에 좋은 예제로, 목표한 패턴을 출력하기 위해 다음과 같은 알고리즘을 설계했습니다.알고리즘1단계: 패턴의 높이(Bash Height)를 설정한다 2단계: 행(row)의 개수를 처리하는 외부 루프를 작성한다 3단계: 열(column)을 처리하는 내부 루프를 작성한다 4단계: 문자(@)를 출력하여 패턴을 만든다 5단계: 각 행이 끝날 때마다 줄
이 문제에서는 n개의 문자로 구성된 문자열이 주어지며, 해당 문자열의 문자들을 조합해 만들 수 있는 모든 순열(permutation)을 출력해야 합니다. 이때 각 문자의 중복 사용(반복)이 허용됩니다. 또한 순열은 반드시 알파벳 순서(사전순, lexicographical order)대로 정렬하여 출력해야 합니다.예시를 통해 문제를 더 자세히 살펴보겠습니다.입력 − XY출력 − XX, XY, YX, YY접근 방법 : 고정 후 재귀(Fix and Recur) 논리이 문제를 해결하려면 고정 후 재귀(fix and recur) 기법을 활용
이 문제에서는 길이가 n인 문자열이 주어지며, 문자열을 구성하는 문자들의 모든 순열(permutation)을 정렬된 순서, 즉 사전식(lexicographical) 순서로 출력해야 합니다.문제 이해하기예시를 통해 문제를 살펴보겠습니다.입력: XYZ출력: XYZ, XZY, YXZ, YZX, ZXY, ZYX위 예제에서 볼 수 있듯이, 우리는 모든 순열을 사전식 순서(알파벳 오름차순)로 출력해야 합니다. 사전식 순서란 사전에서 단어가 배열되는 방식과 동일하게, 앞 문자부터 비교하여 알파벳 순으로 나열하는 방식을 의미합니다.문제 해결 접근
문제 개요 m×n 크기의 2차원 행렬이 주어졌을 때, 행렬의 왼쪽 위(첫 번째 셀)에서 오른쪽 아래(마지막 셀)까지 이동할 수 있는 모든 경로를 출력하는 것이 이 문제의 목표입니다. 탐색 시에는 상하좌우 네 방향, 즉 왼쪽·오른쪽·위·아래 어느 방향으로든 이동할 수 있습니다. 네 방향 중 오른쪽과 위쪽 이동은 실제로 사용 빈도가 낮지만, 특정 조건에서는 유용하게 활용될 수 있습니다. 예제 입력: 1 3 5 2 8 9 출력: 1 -> 3 -> 5 -> 9 1 -> 3 -> 8 -> 9 1 ->
문제 개요이 문제에서는 방향 그래프(Directed Graph)가 주어지며, 출발점(Source)에서 도착점(Destination)까지 이어지는 모든 경로를 찾아 출력해야 합니다.방향 그래프란 간선(edge)에 방향성이 존재하는 그래프를 의미합니다. 즉, 정점 a에서 정점 b로 향하는 간선은 한 방향으로만 이동할 수 있습니다.예시다음 그림과 같은 그래프가 있다고 가정해 보겠습니다.출발점(Source) = K도착점(Destination) = P출력 결과: P P P위 결과는 K에서 P까지 도달할 수 있는 세 가지 경로를 모두 찾아 출
문제 개요이 문제에서는 방향 그래프(directed graph)가 주어지며, 너비 우선 탐색(BFS)을 이용해 시작 정점(소스)에서 목적지 정점까지 이르는 모든 경로를 찾아 출력해야 합니다.방향 그래프란 간선에 방향성이 있어 정점 a에서 정점 b로 한 방향으로만 이동할 수 있는 그래프를 의미합니다.예시로 이해하기다음 예시를 통해 문제를 살펴보겠습니다.Source = K, Destination = P일 때,출력 결과K -> T -> Y -> A -> PK -> T -> Y -> PK -> A
문제 개요이 문제에서는 소문자 알파벳으로만 구성된 행렬(matrix)이 주어지며, 행렬의 왼쪽 위(좌상단) 칸에서 오른쪽 아래(우하단) 칸으로 이동하면서 만들 수 있는 모든 경로 중, 문자열이 회문(palindrome)이 되는 경로를 모두 출력해야 합니다.허용되는 이동은 오른쪽과 아래쪽 두 방향뿐이며, 대각선 이동은 허용되지 않습니다.문제 예시예제를 통해 문제를 이해해 보겠습니다.입력: matrix[][] = { {xxxy, yxxx, xyyx} 출력: xxxxxx , xxxxxx , xyxxyx풀이 설명왼쪽
이 글에서는 주어진 문자열을 여러 조각으로 나누었을 때 모든 조각이 회문(palindrome)이 되도록 하는 모든 가능한 분할(partition)을 찾아 출력하는 방법을 다룹니다. 회문이란 앞에서 읽으나 뒤에서 읽으나 동일한 문자열을 의미합니다.문제 이해하기먼저 예시를 통해 문제를 살펴보겠습니다.입력 − string = ababa출력 − ababa, a bab a, a b a b a …ababa는 그 자체로 회문이므로 전체를 하나로 두는 것도 유효한 분할입니다. 또한 한 글자씩 잘라도 모든 조각이 회문이 되므로 역시 유효합니다. 이
이 문제에서는 하나의 문자열이 주어지며, 해당 문자열의 문자들을 재배열하여 만들 수 있는 모든 회문(팰린드롬) 순열을 출력해야 합니다.예시를 통해 문제를 살펴보겠습니다.입력 − string = aabb출력 − abba baabaabb의 문자들을 재배치하면 abba와 baab라는 두 가지 회문을 만들 수 있습니다.문제 해결 접근 방법이 문제를 해결하려면 문자열의 문자들을 하나씩 활용하여 만들 수 있는 모든 회문 문자열을 생성해야 합니다. 전체 과정은 다음과 같습니다.1단계 − 문자열로 회문을 만들 수 있는지 먼저 확인합니다. 각 문자
이 문제에서는 정수 배열과 하나의 정수(sum)가 주어지며, 두 원소의 합이 주어진 값과 일치하는 모든 정수 쌍을 찾아 출력해야 합니다.예시를 통해 문제를 이해해 보겠습니다.입력 − array = {1, 6, -2, 3}, sum = 4출력 − (1, 3), (6, -2)즉, 배열에서 서로 다른 두 원소를 골라 그 합이 4가 되는 모든 조합을 찾으면 됩니다.방법 1: 이중 반복문(브루트 포스)가장 단순한 해결 방법은 배열의 모든 원소 쌍을 하나씩 검사하는 것입니다. 바깥쪽 반복문으로 각 원소를 순회하고, 안쪽 반복문으로 해당 원소
이 문제에서는 서로 다른 정수로 이루어진 배열과 하나의 목표 합(sum)이 주어지며, 그 합이 되는 모든 세 원소 조합(삼중항, triplet)을 찾아 출력해야 합니다.먼저 예시를 통해 문제를 살펴보겠습니다.입력 : array = {0 , 2 , -1 , 1, -2} 합(Sum) = 1 출력 : 1 2 -2 0 2 -1방법 1: 브루트 포스 (3중 반복문)가장 단순한 접근 방식은 세 개의 반복문을 사용하여 배열에서 선택 가능한 모든 세 원소 조합의 합을 계산하고, 그 합이 목표값과 일치하는 조합을 출력하는 것입니다.예제 코드#inc
이 문제에서는 숫자로 이루어진 정렬된 배열이 주어지며, 그중 등차수열(Arithmetic Progression, AP) 형태를 이루는 모든 삼중항(세 개의 원소 조합)을 찾아야 합니다.등차수열이란 연속한 항 사이의 차이가 항상 일정한 수열을 의미합니다. 예를 들어 2, 5, 8은 공차가 3인 등차수열입니다.문제 이해를 위한 예시입력 : array = {2, 5, 7, 8, 9, 10}출력 :2 5 85 7 97 8 98 9 10해결 방법1. 단순한 접근 방식 (브루트 포스)가장 간단한 방법은 세 개의 반복문을 사용하여 가능한 모든
문제 개요이 문제에서는 n개의 서로 다른 정수로 이루어진 배열이 주어집니다. 우리가 찾아야 할 것은 배열에 있는 두 정수를 더한 값(합) 중에서 가장 많은 빈도로 나타나는 합입니다. 하나의 합이 여러 쌍에서 동일하게 나타날 수 있으며, 최대 빈도를 가지는 답이 여러 개일 경우 해당하는 모든 합을 출력해야 합니다.입력 예시Input : array = { 1, 12, 5, 7, 9, 11 }Output : 16 12설명: 합 16과 12가 각각 두 번씩 나타납니다.5 + 11 = 16 & 7 + 9 = 161 + 11 = 12
문제 개요이 문제에서는 하나의 이진 트리(Binary Tree)와 합계 S가 주어집니다. 우리가 찾아야 하는 것은 트리의 루트(root)에서 시작하여 임의의 노드까지 이어지는 경로 중에서, 경로에 있는 노드 값들의 합이 주어진 합 S와 정확히 일치하는 모든 경로입니다.입력 예시Sum = 14 Output : path : 4 10 4 3 7위 예시에서 합이 14가 되는 경로는 두 가지입니다. 첫 번째는 루트 4에서 왼쪽 자식 10으로 이어지는 경로(4 + 10 = 14)이고, 두 번째는 루트 4에서 오른쪽 자식 3, 그다음 7로 이어