문제 소개n, r, k가 주어졌을 때, n개의 대상 중 r개를 선택하는 모든 방법의 수를 구하되, 특정한 k개는 반드시 함께 포함되어야 하는 조건이 붙는 문제입니다.입력 : n = 8, r = 5, k = 2출력 : 960입력 : n = 6, r = 2, k = 2출력 : 2일반적인 순열 계산과 달리, 이 문제에는 지정된 k개의 요소가 항상 하나의 묶음으로 함께 등장해야 한다는 추가 조건이 있습니다. 따라서 코드를 작성하기 전에 먼저 수학적 공식을 도출하는 것이 핵심입니다.접근 방법: 공식 유도하기핵심 아이디어는 k개의 요소를 하나
이 문제에서는 하나의 트리가 주어지며, 지정된 특정 노드를 루트로 간주하여 해당 노드로부터 DFS(깊이 우선 탐색)를 수행해야 합니다. 문제 상황 예를 들어 아래 트리에서 노드 F를 기준으로 DFS를 수행해야 한다고 가정해 보겠습니다. 일반적인 방식이라면 쿼리가 들어올 때마다 해당 노드에서 DFS를 매번 새로 실행해야 하지만, 이는 비효율적입니다. 효율적인 접근 방식 이 튜토리얼에서는 시간 복잡도를 크게 줄일 수 있는 비전통적인 기법을 적용하여, 제약 조건이 큰 입력에서도 코드가 시간 초과(TLE) 없이 동작하도록 만들어 보겠습니다
이번 글에서는 주어진 범위 안의 숫자들이 짝수인지 홀수인지, 즉 숫자의 홀짝성(parity)에 대한 확률을 구하는 문제를 다룹니다. 각 쿼리마다 결과를 분수 형태인 p / q로 출력해야 하며, 이때 p와 q는 서로소(최대공약수가 1)여야 합니다.문제 예시입력 : N = 5, arr[] = { 6, 5, 2, 1, 7 } query 1: 0 2 2 query 2: 1 2 5 query 3: 0 1 4 출력 : 0 3 4 1 2해결 접근 방법핵심 아이디어는 접두사 합(prefix sum) 기법을 활용하는 것입니다. 배열을 한 번만 순
이 글에서는 주어진 문자열에서 만들 수 있는 부분 문자열(substring)의 개수(빈 문자열은 제외)를 구하는 다양한 접근 방법을 알아봅니다.문제 이해하기먼저 예제를 통해 문제를 살펴보겠습니다.입력 : string = moon 출력 : 10 설명 : 부분 문자열은 m, o, o, n, mo, oo, on, moo, oon, moon으로 총 10개입니다. 입력 : string = yellow 출력 : 21풀이 접근 방법문자열의 길이를 n이라고 가정해 봅시다. 위 예제에서 확인할 수 있듯이, 가능한 모든 부분 문자열의 개수를 구하려
이 글에서는 두 개의 문자열이 주어졌을 때, 첫 번째 문자열의 부분 문자열 중 몇 개가 두 번째 문자열 안에서 발견되는지 그 개수를 구하는 방법을 알아봅니다. 동일한 부분 문자열은 여러 번 등장할 수 있다는 점에 유의하세요.예시입력 : string1 = fogl string2 = google 출력 : 6 설명 : string2에 존재하는 string1의 부분 문자열은 [ o, g, l, og, gl, ogl ] 입니다. 입력 : string1 = ajva string2 = java 출력 : 5 설명 : s
이 글에서는 주어진 수 N의 팩토리얼(N!)을 16진수로 표현했을 때 뒤에 붙는 0(후행 0)의 개수를 구하는 문제를 다룹니다.입력 : N = 7 출력 : 1 설명 : fact(7) = 5040 (10진수), 16진수로는 13B0이며 후행 0이 1개입니다. 입력 : N = 11 출력 : 2 설명 : fact(11) = 39916800 (10진수), 16진수로는 2611500이며 후행 0이 2개입니다.진법 변환 과정 복습먼저 10진수를 다른 진법으로 변환하는 과정을 간단히 복습해 보겠습니다. (5040)₁₀을 16진수로 변환하는 예
이 글에서는 주어진 수 N의 팩토리얼(N!)을 B진법으로 표현했을 때 끝에 연속해서 붙는 0(후행 0)의 개수를 구하는 문제를 다룹니다.문제 예시입력 : N = 7, 진법 = 2 출력 : 4 설명 : 7! = 5040 (10진수)이며, 2진수로는 1001110110000으로 표현되어 후행 0이 4개입니다. 입력 : N = 11, 진법 = 5 출력 : 2 설명 : 11! = 39916800 (10진수)이며, 5진수로는 40204314200으로 표현되어 후행 0이 2개입니다.진법 변환 과정 복습먼저 10진수를 다른 진법으로 변환하는
문제 소개이 글에서는 먼저 색칠되지 않은 하나의 삼각형을 준비하고, 이 삼각형을 면적이 같은 네 개의 작은 정삼각형으로 나눕니다. 그런 다음 이 과정을 n번째 단계까지 반복한 뒤, 최종적으로 완성된 도형 안에 존재하는 정삼각형의 개수를 구하는 것이 목표입니다.문제 해결 접근 방법이 문제를 해결하는 방법은 크게 두 가지가 있습니다.브루트 포스(Brute Force) 접근삼각형의 개수가 매 단계마다 일정한 규칙, 즉 3 × 이전 개수 + 2만큼 증가한다는 사실을 관찰할 수 있습니다. 따라서 n번까지 반복문을 실행하면서 삼각형의 개수를
문제 소개세 개의 직선 위에 각각 여러 개의 점이 놓여 있을 때, 이 점들을 이용해 만들 수 있는 삼각형이 총 몇 개인지 구하는 문제입니다.입력: m = 3, n = 4, k = 5출력: 205입력: m = 2, n = 2, k = 1출력: 10이 문제는 조합론을 활용하면 하나의 간단한 공식으로 해결할 수 있습니다.해결 접근 방법핵심 아이디어는 다음과 같습니다. 세 점이 삼각형을 이루려면 반드시 세 점이 한 직선 위에 있으면 안 됩니다. 따라서 전체 점 중 3개를 뽑는 모든 경우의 수에서, 같은 직선 위에 있는 3점을 뽑는 경우의
개요C++에서 배열에 존재하는 고유한 쌍(unique pair)의 개수를 구하는 문제는 알고리즘 학습에서 자주 등장하는 주제입니다. 여기서 고유한 쌍이란 주어진 배열에서 만들 수 있는 모든 가능한 순서쌍 중 중복되지 않는 쌍을 의미합니다.예를 들어 다음과 같습니다.입력 : array[] = { 5, 5, 9 }출력 : 4설명 : 고유한 쌍은 (5, 5), (5, 9), (9, 5), (9, 9)로 총 4개입니다.입력 : array[] = { 5, 4, 3, 2, 2 }출력 : 16해결 방법이 문제를 해결하는 방법은 크게 두 가지가
문제 설명이번 문제에서는 0과 1로만 구성된 이진 문자열이 주어지며, 이 문자열의 모든 순열 중 1로 시작하는 순열의 총 개수를 구해야 합니다. 답이 매우 큰 값이 될 수 있으므로 1000000007(10^9 + 7)로 나눈 나머지 형태로 출력합니다.입력 : str = 10101001001 출력 : 210 입력 : str = 101110011 출력 : 56이 문제는 조합론(combinatorics)적 사고를 바탕으로 공식을 유도하면 비교적 간단하게 해결할 수 있습니다.해결 접근 방식먼저 문자열에 포함된 1의 개수와 0의 개수를 각
N개의 정수로 이루어진 배열과 Q개의 범위 쿼리가 주어졌을 때, 각 쿼리마다 해당 범위 안에 있는 모든 숫자의 최대 홀수 약수(greatest odd divisor)를 구한 후, 이 값들을 XOR 연산한 결과를 반환하는 문제입니다.여기서 최대 홀수 약수란 어떤 수 N을 나눌 수 있는 가장 큰 홀수를 의미합니다. 예를 들어 6의 최대 홀수 약수는 3입니다.입력: nums[] = { 3, 6, 7, 10 }, query[] = { { 0, 2 }, { 1, 3 } }출력:쿼리1: 7쿼리2: 1설명: nums 배열 각 원소의 최대 홀수
이 글에서는 주어진 범위 내에 존재하는 모든 부분 배열(subarray)의 XOR 값을 계산하여 출력하는 방법을 다룹니다. 먼저 예시를 통해 문제를 이해해 보겠습니다.문제 예시입력 : arr[] = { 4, 1, 2, 3, 5 }, Q = 3 쿼리 q1 = { 1, 2 } q2 = { 2, 4 } q3 = { 1, 4 } 출력 : 0 2 0쿼리 2(범위 2~4)를 예로 들어 설명하면, 해당 범위에서 만들 수 있는 부분 배열은 다음과 같습니다.{1}, {2}, {3}, {1, 2}, {2, 3}, {1, 2, 3}여기서 각 원소
배열과 여러 개의 쿼리가 주어졌을 때, 각 쿼리 인덱스를 기준으로 그 왼쪽에 있는 0과 1의 개수를 구하는 문제를 살펴보겠습니다. 예를 들면 다음과 같습니다. Input: arr[ ] = { 0, 1, 1, 1, 0, 0, 0, 1, 0, 0}, queries[ ] = { 2, 4, 1, 0, 5 } Output: query 1: zeros = 1, ones = 1 query 2: zeros = 1, ones = 3 query 3: zeros = 1, ones = 0 query 4: zeros = 0, ones = 0 query 5
배열과 여러 개의 쿼리가 주어집니다. 쿼리에는 두 가지 종류가 있습니다. update[L, R]는 L부터 R까지의 모든 요소를 각각의 제곱근 값으로 변경하는 연산이고, query[L, R]는 L부터 R까지의 요소 합을 계산하는 연산입니다. 여기서는 1-based 인덱스 배열을 사용한다고 가정합니다. Input: nums[ ] = { 0, 9, 4, 1, 5, 2, 3 }, Query[ ] = { {1, 1, 3}, {2, 1, 2}, {1, 2, 5}, { 1, 4, 5}} Output: 14 10 7 첫 번째 쿼리의 첫 번째
희소 테이블(Sparse Table)은 범위 쿼리(range query)의 결과를 빠르게 구하기 위해 사용되는 자료구조입니다. 대부분의 범위 쿼리를 O(logN) 시간 복잡도로 처리할 수 있으며, 특히 구간 최댓값(maximum) 쿼리는 O(1)만에 답을 계산할 수 있습니다.이 글에서는 주어진 배열에서 인덱스 L부터 R까지 구간에 포함된 모든 원소의 합을 구하는 범위 합(Range Sum) 쿼리 문제를 희소 테이블을 이용해 해결하는 방법을 살펴보겠습니다.입력: arr[] = { 2, 4, 1, 5, 6, 3 } query(1, 3)
이번 글에서는 n×n 격자 미로에서 출발하는 미로의 쥐(Rat in a Maze) 문제의 변형 버전을 다룹니다. 쥐는 격자의 왼쪽 위 모서리에 위치해 있으며, 오른쪽(앞쪽) 또는 아래쪽으로만 이동할 수 있습니다. 또한 이동하려는 칸의 값이 0이 아닌 경우에만 그 칸을 밟을 수 있습니다.이 변형 문제의 핵심은 여러 칸 점프(multiple jumps)가 허용된다는 점입니다. 현재 칸에 적힌 숫자가 곧 쥐가 한 번에 점프할 수 있는 최대 거리를 의미합니다. 예를 들어 현재 칸의 값이 3이라면, 쥐는 오른쪽 또는 아래 방향으로 1칸, 2
문제 개요이번 글에서는 등차수열(Arithmetic Progression, A.P.)에서 처음 m개 항의 합과 처음 n개 항의 합의 비율이 주어졌을 때, m번째 항과 n번째 항의 비율을 구하는 문제를 다뤄보겠습니다.입력: m = 8, n = 4출력: 2.142입력: m = 3, n = 2출력: 1.666입력: m = 7, n = 3출력: 2.6해결 접근 방법m번째 항과 n번째 항의 비율을 코드로 계산하려면 먼저 수식을 간단하게 정리해야 합니다. 등차수열의 처음 m개 항의 합을 Sm, 처음 n개 항의 합을 Sn이라고 정의하겠습니다.a
문자열에 포함된 알파벳들을 사전순(오름차순)으로 재배열하고, 문자열 안에 있는 모든 숫자들의 합을 뒤에 이어 붙이는 문제를 살펴보겠습니다.문제 예시입력 : str = adv4fc3 출력 : acdfv7 설명 : 모든 알파벳은 acdfv로 정렬되고, 그 뒤에 숫자 4와 3의 합인 7이 붙습니다. 입력 : str = h2d7e3f 출력 : defh12 설명 : 모든 알파벳은 defh로 정렬되고, 그 뒤에 숫자 2, 7, 3의 합인 12가 붙습니다.해결 접근 방법이 문제에서 수행해야 할 작업은 두 가지입니다. 하나는 문자열을 정렬하는
이 튜토리얼에서는 C++에서 HashMap(std::map)을 순회하는 도중에 키를 이용해 특정 항목을 제거하는 방법을 알아봅니다. 먼저 예시를 통해 문제 상황을 확인해 보겠습니다.입력: HashMap: { 1: Tutorials, 2: Tutorials, 3: Point }, key=1 출력: HashMap: { 2: Tutorials, 3: Point } 설명: 키 1에 해당하는 첫 번째 요소가 제거되었습니다. 입력: HashMap: