이 문제에서는 두 개의 양수 n과 m(n ≤ m)이 주어지며, 각각 두 집합에 속한 원소의 총 개수를 나타냅니다. 목표는 이 두 집합의 원소들로부터 하나 이상의 쌍(pair)을 선택하는 방법의 총 개수를 구하는 것입니다.문제 이해를 위한 예시입력2 2출력6설명두 집합은 각각 두 개의 원소를 가지고 있습니다.집합 A = {1, 2} 집합 B = {3, 4}한 번에 한 쌍씩 선택하는 방법은 다음과 같습니다. (1, 3), (1, 4), (2, 3), (2, 4)한 번에 두 쌍씩 선택하는 방법은 다음과 같습니다. (1-3, 2-4), (
문제 개요 이 문제에서는 하나의 이진 문자열(binary string)이 주어지며, 문자열에서 요소를 정확히 하나 제거했을 때 전체 비트의 XOR 값이 0이 되도록 만들 수 있는 경우의 수를 구해야 합니다. 예제를 통해 문제를 더 구체적으로 살펴보겠습니다. 입력 n = 11010 출력 3 11010에는 1이 3개(홀수) 있으므로, 1 중 하나를 제거하면 XOR이 0이 됩니다. 제거할 수 있는 1은 총 3개이므로 정답은 3입니다. 핵심 아이디어 XOR 연산의 기본 성질을 활용하면 문제를 간단하게 해결할 수 있습니다. 여러 비트를 X
문제 개요정수 n이 주어졌을 때, 세로로 n개의 선과 가로로 n개의 선이 서로 교차하여 총 n²개의 교차점이 만들어집니다. 이 문제의 목표는 이 교차점들에 4개의 항목을 배치하되, 어느 하나의 행(가로줄)이나 열(세로줄)에도 둘 이상의 항목이 포함되지 않도록 하는 배치 방법의 총 개수를 구하는 것입니다.예제를 통해 문제를 살펴보겠습니다.입력n = 4출력24설명n이 4일 때, 4×4 격자의 교차점 위에 4개의 항목을 서로 다른 행과 열에 하나씩만 배치하는 경우의 수는 24가지입니다.접근 방법이 문제를 해결하려면 먼저 n개의 가로선 중
이 문제에서는 n개의 계단과 빨간색, 노란색 두 가지 색이 주어집니다. 우리가 해야 할 일은 계단을 색칠하는 모든 방법 중에서 노란색 계단이 연속해서 나오지 않는 경우의 수를 세는 것입니다.예시를 통해 문제를 자세히 살펴보겠습니다.입력 예시3출력 결과5설명계단을 색칠할 수 있는 방법은 YRY, RYR, YRR, RRY, RRR로 총 5가지입니다. 여기서 R은 빨간색(Red), Y는 노란색(Yellow)을 의미합니다.이제 계단을 색칠하는 방법의 수가 어떤 패턴을 보이는지 단계별로 확인해 보겠습니다.N = 1일 때, 방법의 수 = 2
문제 개요이 문제에서는 두 개의 정수 n과 m이 주어집니다. 여기서 n은 그려야 할 그림의 개수, m은 사용할 수 있는 색상의 개수를 의미합니다. 우리가 구해야 할 것은 인접한 두 그림이 같은 색으로 칠해지지 않도록 모든 그림을 칠할 수 있는 총 경우의 수입니다.예제를 통해 문제를 자세히 살펴보겠습니다.입력n = 3, m = 3출력12설명P1 P2 P3C1 C2 C3C1 C3 C2C1 C2 C1C1 C3 C1C2 C1 C2C2 C3 C2C2 C1 C3C2 C3 C1C3 C1 C3C3 C2 C3C3 C1 C2C3 C2 C1그림 3개와
이 문제에서는 요소의 개수를 나타내는 정수 n이 주어지며, 우리의 과제는 결합 법칙(associative operation)을 적용하여 n개의 요소를 곱할 수 있는 경우의 수를 세는 프로그램을 작성하는 것입니다.결합 법칙(연관 연산)이란 숫자들을 어떤 순서나 방식으로 배치하더라도 항상 동일한 결과를 반환하는 연산을 의미합니다.예시를 통해 문제를 자세히 살펴보겠습니다.입력3출력12설명(x*(y*z)), (x*(z*y)), (y*(x*z)), (y*(z*x)), (z*(x*y)), (z*(y*x)),((x*y)*z), ((y*x)*z)
C++ 속성(Attribute)이란?C++의 속성(Attribute)은 동일한 코드가 서로 다른 컴파일러에서 실행되더라도 일관된 동작을 보장하기 위해 표준화된 현대적인 기능입니다. 속성은 컴파일러에 추가 정보를 전달하여 조건(제약) 강제, 코드 최적화, 필요 시 특정 코드 생성 등을 수행하도록 돕습니다.즉, 속성은 컴파일러를 위한 일종의 정보 매뉴얼로서, 코드 성능 향상에 필요한 규칙을 적용하는 역할을 합니다. 속성은 C++11에서 처음 도입되었으며, 이후 언어의 중요한 구성 요소로 자리 잡았습니다. 또한 표준이 개정될 때마다 지속
C 언어에서 파일 처리(File Handling)란?파일 처리(File Handling)란 프로그램을 통해 데이터를 파일에 저장하는 작업을 의미합니다. C 프로그래밍에서는 파일 처리 기능을 활용해 프로그램의 실행 결과나 각종 데이터를 파일에 저장할 수 있으며, 반대로 파일에 저장된 데이터를 불러와 프로그램에서 활용하는 것도 가능합니다.C 언어에서 파일에 대해 수행할 수 있는 주요 연산은 다음과 같습니다.새로운 파일 생성기존 파일 열기기존 파일에서 데이터 읽기파일에 데이터 쓰기파일 내 특정 위치로 이동하여 데이터 처리파일 닫기fope
조건부 확률(Conditional Probability)은 P(A|B)로 표기하며, 사건 B가 이미 발생했다는 조건 하에서 사건 A가 발생할 확률을 의미합니다. 조건부 확률의 기본 공식 P(A|B) = P(A∩B) / P(B) 즉, 전체 표본 공간이 아닌 사건 B가 발생한 경우만을 새로운 표본 공간으로 삼고, 그 안에서 사건 A가 일어날 비율을 계산하는 것입니다. 베이즈 정리(Bayes Theorem)란? 베이즈 정리는 서로 종속 관계에 있는 사건들의 발생 확률 간의 관계를 나타내는 공식으로, 조건부 확률들 사이의 관계를 설명합니다
버클리 알고리즘이란?버클리 알고리즘(Berkeleys Algorithm)은 분산 시스템(distributed system)에서 여러 노드의 시계를 동기화하기 위해 사용되는 대표적인 알고리즘입니다. 이 알고리즘은 분산 네트워크를 구성하는 일부 또는 전체 시스템이 다음과 같은 문제를 가지고 있을 때 특히 유용하게 활용됩니다.머신에 정확한 시간 소스(time source)가 없는 경우네트워크나 머신에 UTC 서버가 존재하지 않는 경우분산 시스템은 물리적으로 떨어져 있지만 네트워크를 통해 서로 연결된 여러 개의 노드(node)로 구성됩니다
베르트랑 공준(Bertrands Postulate)은 수학의 한 정리로, 3보다 큰 모든 자연수 n에 대해 n과 2n−2 사이에는 반드시 소수 p가 하나 이상 존재한다는 내용입니다. 이 명제는 1845년 프랑스 수학자 조제프 베르트랑(Joseph Bertrand)이 실험적 데이터를 바탕으로 처음 제안했으며, 이후 1852년 러시아의 수학자 파프누티 체비쇼프(Pafnuty Chebyshev)가 수학적으로 증명하였습니다. 베르트랑 공준의 공식 n < p < 2n − 2 여기서 n은 n > 3을 만족하는 자연수이며, p
C++ 표준 템플릿 라이브러리(STL)에는 두 양의 실수에 대한 베타 함수(Beta Function) 값을 계산해 주는 내장 함수인 beta(), betaf(), betal()이 포함되어 있습니다. 이 세 함수는 기능적으로 동일하지만, 다루는 자료형(double, float, long double)이 서로 다르다는 점이 차이입니다. 베타 함수는 다음과 같이 정적분 형태로 정의됩니다. $B(x,y)=\int_{0}^{1}t^{(x-1)}(1-t)^{(y-1)}dt$ 참고로 이 함수들은 C++17부터 <cmath> 헤더를 통
문제 개요크기가 n인 배열이 주어지며, 처음에는 모든 원소가 0으로 초기화되어 있습니다. 이 배열에 대해 다음 두 가지 종류의 쿼리를 수행해야 합니다.update(l, r, value) — 인덱스 l부터 r 사이의 모든 배열 원소에 value를 더합니다. 예를 들어 update(2, 4, 5)는 인덱스 2, 3, 4의 원소에 각각 5를 더합니다.getRangeSum(l, r) — 인덱스 l부터 r 사이에 있는 원소들의 합을 구합니다. 예를 들어 getRangeSum(4, 7)은 인덱스 4, 5, 6, 7에 해당하는 원소들의 합을 반
문제 개요 이 문제에서는 하나의 이진 트리(Binary Tree)가 주어지며, C++를 사용하여 이 트리를 괄호가 포함된 문자열 형태로 변환하는 프로그램을 작성하는 것이 목표입니다. 이진 트리의 각 노드 값은 정수이며, 트리는 전위 순회(preorder traversal) 방식으로 프로그램에 입력됩니다. 최종적으로 만들어질 문자열에는 정수와 괄호 ()만 포함되어야 하며, 불필요한 요소를 제거하는 최적화도 필수입니다. 즉, 의미 없는 빈 괄호 쌍은 모두 삭제해야 합니다. 이진 트리란? 이진 트리는 각 노드가 최대 두 개의 자식 노드만
이 글에서는 리눅스 환경에서 파이프(pipe)를 활용하는 C 프로그램을 직접 만들어 보겠습니다. 이 프로그램은 입력 스트림으로부터 텍스트를 읽어 들인 후, 이를 출력 화면에 그대로 표시하는 역할을 합니다. 리눅스 파이프(pipe)란 무엇인가? 파이프는 데이터를 전송하기 위한 통신 수단으로, 리눅스 또는 유닉스 기반 시스템에서 프로세스·명령어·프로그램 간에 표준 출력(standard output)을 전달할 때 사용됩니다. 셸에서 자주 쓰이는 ls | grep txt와 같은 명령 조합도 내부적으로는 파이프를 통해 두 명령 사이의 데이터
이번 문제는 스트로보그램매틱 숫자(Strobogrammatic Number)의 총 개수를 특정 범위 [low, high] 안에서 세는 함수를 정의하는 것입니다.스트로보그램매틱 숫자란 180도 회전했을 때 원래 모양과 똑같이 보이는 수를 말합니다. 예를 들어 69는 뒤집으면 96처럼 보이지만, 실제로 자기 자신과 같은 형태를 유지하는 대표적인 숫자 조합은 0↔0, 1↔1, 8↔8, 6↔9, 9↔6입니다.예를 들어 입력이 low = 50, high = 100이라면 출력은 3이 됩니다. 이 범위에 속하는 스트로보그램매틱 숫자는 69, 8
문제 개요n개의 집이 한 줄로 나열되어 있고, 각 집은 k가지 색상 중 하나로 칠할 수 있다고 가정해 봅시다. 집마다 특정 색상으로 칠하는 비용은 서로 다릅니다. 이때 인접한 두 집이 같은 색이 되지 않도록 모든 집을 칠해야 한다는 조건이 있습니다.각 집을 특정 색으로 칠하는 비용은 n × k 크기의 행렬로 주어지며, 우리의 목표는 모든 집을 칠하는 데 드는 최소 비용을 구하는 것입니다.예시입력이 다음과 같다고 가정해 보겠습니다.153294이 경우 출력은 5입니다. 0번 집을 0번 색으로, 1번 집을 2번 색으로 칠하면 비용은 1
문제 설명새로운 외계인 언어가 있다고 가정해 보겠습니다. 이 언어는 라틴 알파벳을 사용하지만, 글자들 사이의 순서는 아직 알려져 있지 않습니다. 우리에게는 이 언어의 규칙에 따라 사전순으로 정렬된 비어 있지 않은 단어 목록이 주어지며, 이 목록을 분석해 해당 언어에서 글자들이 배열된 순서를 찾아내야 합니다.예를 들어 입력이 [wrt, wrf, er, ett, rftt]라면, 올바른 출력은 wertf입니다.해결 접근 방식: 위상 정렬(Topological Sort)이 문제의 핵심은 인접한 두 단어를 나란히 놓고 앞에서부터 한 글자씩
문제 설명 이진 검색 트리(BST)와 하나의 목표값(target)이 주어졌을 때, 트리에 있는 값 중 target에 가장 가까운 k개의 값을 찾아야 합니다. 이때 target은 부동소수점 실수라는 점에 유의해야 하며, k는 항상 유효한 값(k ≤ 전체 노드 수)이라고 가정할 수 있습니다. 예를 들어 아래와 같은 트리가 주어지고, target = 3.714286, k = 2라면 출력은 [4, 3]이 됩니다. 알고리즘 접근 방식 이 문제는 두 개의 스택을 활용하면 효율적으로 해결할 수 있습니다. 하나는 target보다 작은 값들을
패턴(pattern)과 문자열 str이 주어졌을 때, str이 해당 패턴을 따르는지 확인해야 합니다. 여기서 패턴을 따른다는 것은 완전 일치(full match)를 의미하며, 패턴의 각 문자와 str의 비어 있지 않은 부분 문자열 사이에 전단사(bijection), 즉 일대일 대응 관계가 성립해야 합니다.예를 들어 패턴이 "abaa"이고 str이 "orangegreenorangeorange"라면 결과는 true입니다. a는 "orange"에, b는 "green"