문제 이해하기정수로 이루어진 배열 A가 주어졌을 때, 다음 조건을 만족하는 비어 있지 않은 연속된 부분 배열(subarray)의 개수를 구하는 것이 목표입니다.조건: 부분 배열의 가장 왼쪽(첫 번째) 원소가, 그 부분 배열에 포함된 나머지 모든 원소보다 작거나 같아야 합니다.예시입력이 [1, 4, 2, 5, 3]이라면 정답은 11입니다. 조건을 만족하는 부분 배열은 다음과 같습니다.[1], [4], [2], [5], [3], [1,4], [2,5], [1,4,2], [2,5,3], [1,4,2,5], [1,4,2,5,3]접근 방법:
문제 소개0부터 9 사이의 정수 하나(d)와 두 개의 양의 정수 low, high가 주어집니다. 이때 low부터 high까지(양 끝값 포함)의 모든 정수에서 숫자 d가 총 몇 번 등장하는지 구해야 합니다.예를 들어 d = 1, low = 1, high = 13이 입력으로 주어지면 결과는 6입니다. 1, 10, 11, 12, 13 안에서 숫자 1이 총 6번 나타나기 때문입니다.해결 전략구간의 모든 수를 하나씩 직접 확인하는 방법도 있지만, 자릿수의 규칙성을 활용하면 훨씬 빠르게 계산할 수 있습니다. 핵심 아이디어는 다음과 같습니다.f
문제 이해하기 어떤 숫자를 180도 회전했을 때 새로운 숫자가 만들어지는 경우를 생각해 보겠습니다. 0, 1, 6, 8, 9를 180도 회전하면 각각 0, 1, 9, 8, 6으로 바뀝니다. 반면 2, 3, 4, 5, 7은 회전했을 때 유효한 숫자가 되지 않습니다. 혼란스러운 숫자(confusing number)란 180도 회전했을 때 원래 값과 다른 새로운 숫자가 되는 수를 말합니다. 따라서 양의 정수 N이 주어지면, 1부터 N까지(경계값 포함) 범위 안에 있는 혼란스러운 숫자의 개수를 구해야 합니다. 예를 들어 입력이 20이라면
문제 소개크기가 w × h인 행렬 M이 있다고 가정해 보겠습니다. 행렬의 모든 칸은 0 또는 1의 값을 가지며, 크기가 l × l인 임의의 정사각형 부분 행렬(sub-matrix)은 최대 maxOnes개의 1만 포함할 수 있습니다. 이러한 조건을 만족하면서 행렬 M 전체가 가질 수 있는 1의 최대 개수를 구하는 것이 이번 문제의 목표입니다.예시입력이 w = 3, h = 3, l = 2, maxOnes = 1이라면 출력은 4가 됩니다. 3 × 3 행렬 안에서 어떤 2 × 2 부분 행렬도 1을 두 개 이상 가질 수 없기 때문입니다. 1
```html 블록들의 목록이 주어졌다고 가정해 봅시다. blocks[i] = t라면 i번째 블록을 완성하는 데 t 단위의 시간이 필요하다는 의미입니다. 각 블록은 정확히 한 명의 작업자만이 지을 수 있으며, 작업자 한 명은 두 명의 작업자로 분열하거나 블록 하나를 지은 뒤 퇴장하는 두 가지 행동 중 하나를 선택할 수 있습니다. 이때 작업자 하나를 둘로 나누는 데 걸리는 시간은 split이라는 값으로 주어집니다. 예를 들어 입력이 blocks = [1, 2], split = 5라고 해보겠습니다. 이 경우 출력은 7이 됩니다. 작업자
문제 개요문자열 s와 정수 k가 주어졌을 때, 해당 문자열이 K-회문(K-Palindrome)인지 판별하는 문제입니다.여기서 K-회문이란, 문자열에서 최대 k개의 문자를 제거했을 때 회문(palindrome)으로 변환할 수 있는 문자열을 의미합니다.예를 들어 입력이 s = abcdeca, k = 2라고 가정해 보겠습니다. 이 경우 b와 e 두 문자를 제거하면 acdca가 되는데, 이는 앞에서 읽으나 뒤에서 읽으나 같은 회문입니다. 따라서 출력 결과는 true(1)가 됩니다.접근 방법: 최장 공통 부분 수열(LCS) 활용이 문제의 핵
여러 개의 청크(chunk)로 구성된 초콜릿 바가 하나 있고, 각 청크에는 고유한 단맛(sweetness)이 리스트 형태로 주어져 있다고 가정해 봅시다. 이 초콜릿을 K명의 친구들과 나누려면 K번 잘라서 총 K+1개의 조각을 만들어야 하며, 각 조각은 연속된 여러 개의 청크로 이루어집니다. 그중 단맛의 합이 가장 작은 조각을 자신이 가져가고 나머지는 친구들에게 준다고 할 때, 초콜릿을 최적으로 잘라서 얻을 수 있는 조각의 최대 단맛 합을 구하는 것이 이 문제의 목표입니다. 예를 들어 입력이 sweetness = [1,2,3,4,5
문제 개요정수 배열 arr가 주어집니다. 한 번의 이동(move)으로 인덱스 i부터 j까지(i <= j) 구간에 해당하는 회문(palindrome) 부분 배열을 선택하여 제거할 수 있습니다. 이때 부분 배열을 제거하면 남아 있는 왼쪽과 오른쪽 요소들이 서로 붙어 빈 공간을 메운다는 점에 유의해야 합니다.목표는 배열의 모든 숫자를 제거하기 위해 필요한 최소 이동 횟수를 구하는 것입니다.예시입력이 arr = [1, 3, 4, 1, 5]라면 출력은 3입니다. 다음 순서로 제거하면 되기 때문입니다.[4] 제거 → 배열은 [1, 3,
문제 소개짝수 명의 사람 n명이 원을 따라 둘러 서 있다고 가정해 봅시다. 각 사람은 자신을 제외한 다른 한 사람과 악수를 하므로, 전체 악수 횟수는 항상 n / 2번이 됩니다. 우리가 구해야 할 것은 이렇게 진행되는 모든 악수 중에서 서로 교차(엇갈림)하지 않는 경우의 수입니다.단, 가능한 방법의 수가 매우 커질 수 있기 때문에 최종 결과는 10^9 + 7로 나눈 나머지를 반환해야 합니다.예를 들어 입력이 n = 2라면, 두 사람이 서로 악수하는 방법은 단 하나뿐이므로 출력은 1입니다.문제의 본질: 카탈란 수(Catalan Num
이번 글에서는 연결 리스트(Linked List)의 모든 노드를 하나씩 순회하며 삭제하는 함수를 만들어 보겠습니다.C/C++에는 이 작업을 한 번에 처리해 주는 내장 함수가 없습니다. 반면 Java에서는 자동 가비지 컬렉션(Garbage Collection)이 지원되기 때문에 사용되지 않는 객체가 자동으로 메모리에서 해제됩니다. 하지만 C++에서는 개발자가 직접 메모리를 관리해야 하므로, 연결 리스트를 삭제하는 로직을 직접 구현해야 합니다.연결 리스트 삭제의 핵심 원리연결 리스트를 안전하게 삭제하려면 다음 순서를 따라야 합니다.1.
이 문제에서는 주어진 확률을 기반으로 세 개의 숫자 중 하나를 생성하는 함수를 작성해야 합니다.이를 위해 C++에서 기본으로 제공하는 난수 생성 함수 rand()를 활용합니다. 이 함수는 지정한 범위 내에서 모든 숫자가 동일한 확률로 나타나는 특징이 있습니다.우리의 목표는 세 숫자 A, B, C를 각각 P(A), P(B), P(C)라는 확률로 반환하는 것입니다. 확률의 정의에 따라 다음 조건이 성립해야 합니다.P(A) + P(B) + P(C) = 1접근 방법rand(a, b) 함수는 a부터 b까지의 어떤 숫자든 동일한 확률로 나타난
이 문제에서는 하나의 연결 리스트(Linked List)가 주어지며, 특정 정수가 이 리스트 안에서 몇 번 등장하는지 세어 그 횟수를 반환하는 함수를 작성해야 합니다.먼저 예시를 통해 문제를 이해해 보겠습니다.입력연결 리스트 = 10 -> 50 -> 10 -> 20 -> 100 -> 10, 찾을 값 = 10출력3설명 − 숫자 10이 연결 리스트 안에 총 3번 등장하기 때문입니다.해결 아이디어접근 방식은 매우 단순합니다. 연결 리스트를 첫 번째 노드부터 마지막 노드까지 순회(traverse)하면서, 현재 노
C++은 C의 후속 언어로, C의 모든 기능을 포함하고 C 코드와의 호환성을 갖추고 있다고 알려져 있습니다. 하지만 실제로는 C에서는 정상적으로 동작하던 코드가 C++ 컴파일러로 컴파일하면 오류가 발생하는 경우가 존재합니다. 이번 글에서는 C++에서 컴파일되지 않는 대표적인 C 프로그램 사례들을 살펴보겠습니다.1. 함수 선언 전 호출C++에서는 함수를 선언하기 전에 호출하면 컴파일 오류가 발생합니다. 반면 C에서는 함수가 파일 내 어딘가에 정의되어 있으면 선언 없이 호출해도 문제없이 동작합니다.예제#include <stdio.
이 글에서는 Linux의 more 명령어처럼 파일의 내용을 한 번에 일정 분량씩 나누어 화면에 출력하는 C 프로그램을 작성해 보겠습니다.프로그램은 먼저 화면에 지정된 개수(n)만큼의 줄을 출력한 뒤, 사용자가 Enter 키를 누를 때까지 대기합니다. Enter 키가 입력되면 다음 n줄을 이어서 화면에 표시하는 방식으로 동작합니다.동작 원리파일 내용을 이런 방식으로 표시하려면 다음과 같은 절차가 필요합니다.대상 파일을 읽기 모드(r)로 열고, 파일 끝(EOF)까지 문자를 하나씩 읽으면서 화면에 출력합니다.줄바꿈 문자(\n)가 나올 때
배열(Array)과 벡터(Vector)는 경쟁 프로그래밍에서 문제를 해결할 때 가장 널리 사용되는 핵심 자료구조입니다. C++의 STL(Standard Template Library, 표준 템플릿 라이브러리)은 이러한 배열과 벡터에 대한 다양한 연산을 손쉽게 처리할 수 있는 강력한 함수들을 제공합니다. 이 글에서는 STL에서 자주 사용되는 대표적인 함수들을 예제 코드와 실행 결과와 함께 자세히 살펴보겠습니다. 1. 배열/벡터의 합계, 최댓값, 최솟값 구하기 STL에는 배열이나 벡터의 합계, 최댓값, 최솟값을 구할 때 유용하게 쓰이
문제 소개 이 문제에서는 하나의 사전(Dictionary)과 두 단어, 즉 start(시작 단어)와 target(목표 단어)이 주어집니다. 우리의 과제는 시작 단어에서 출발해 목표 단어에 도달하는 체인(사다리)을 만드는 것입니다. 이때 체인에 포함된 각 단어는 바로 앞 단어와 정확히 한 글자만 달라야 하며, 해당 단어는 반드시 사전에 존재해야 합니다. 목표 단어는 항상 사전에 포함되어 있고, 모든 단어의 길이는 서로 같다는 조건이 주어집니다. 프로그램의 최종 목표는 시작 단어에서 목표 단어까지 이르는 최단 경로의 길이를 반환하는
문제 개요 이 문제에서는 하나의 사전(dictionary)과 하나의 단어(word)가 주어지며, 주어진 단어가 사전에 있는 두 단어를 이어 붙여서 만들 수 있는지 확인해야 합니다. 단, 단어를 조합할 때 같은 단어를 반복해서 사용하는 것은 허용되지 않습니다. 먼저 예시를 통해 문제를 자세히 살펴보겠습니다. 입력 dictionary = {"hello", "tutorials", "program", "problem", "coding", "
우드홀 수(Woodall Number)란 무엇인가? 이번 문제에서는 하나의 자연수가 주어졌을 때, 그 수가 우드홀 수(Woodall Number)에 해당하는지 판별하는 것이 목표입니다. 우드홀 수는 수학자 H. J. 우드홀(H. J. Woodall)의 이름에서 유래한 특수한 수열로, 다음과 같은 형태를 가집니다. Wn = n · 2n − 1 여기서 n은 양의 정수입니다. 즉, n과 2의 n제곱을 곱한 값에서 1을 뺀 수가 바로 n번째 우드홀 수입니다. 처음 다섯 개의 우드홀 수는 1, 7, 23, 63, 159입니다. 입력 및 출
이 문제에서는 하나의 정수 n이 주어지며, 우리의 과제는 이 수를 두 개 이상의 양의 정수의 합으로 표현할 수 있는 총 경우의 수를 구하는 것입니다.예시를 통해 문제를 자세히 살펴보겠습니다.입력N = 4출력5설명4는 다음과 같은 방법으로 합을 표현할 수 있습니다. 4, 3+1, 2+2, 2+1+1, 1+1+1+1즉, 4를 양의 정수의 합으로 나타내는 방법은 총 5가지입니다.접근 방법: 오일러 점화식 활용이 문제를 해결하기 위해 우리는 오일러(Euler)의 점화식을 사용합니다. 어떤 수 n에 대해 분할수 p(n), 즉 n을 양의 정수
이 문제에서는 정수 배열과 숫자 N이 주어지며, 배열의 요소들을 더하여 N을 만들 수 있는 총 경우의 수를 구하는 것이 목표입니다. 이때 모든 조합과 중복 사용이 허용됩니다.예시를 통해 문제를 자세히 살펴보겠습니다.입력arr = {1, 3, 5} N = 6출력8설명N = 6을 만들 수 있는 방법은 다음과 같습니다.5+1, 1+5, 3+3, 3+1+1+1, 1+3+1+1, 1+1+3+1, 1+1+1+3, 1+1+1+1+1+1위 예시에서 볼 수 있듯이, 요소가 등장하는 순서가 다르면 서로 다른 조합으로 간주합니다. 예를 들어 4개의 요