문제 소개문자열 S가 하나의 단어 목록을 나타낸다고 가정해 보겠습니다. 이때 단어를 구성하는 각 문자는 하나 이상의 옵션을 가질 수 있습니다. 옵션이 하나뿐이라면 해당 문자는 그대로 표현되고, 옵션이 여러 개라면 중괄호({})로 감싸서 표현합니다.예를 들어 {a,b,c}는 옵션 [a, b, c]를 의미합니다. 따라서 입력이 {a,b,c}d{e,f}와 같다면, 이 문자열은 다음 목록을 나타냅니다.[ade, adf, bde, bdf, cde, cdf]즉, 이 방식으로 만들 수 있는 모든 단어를 사전순(lexicographical ord
길이가 같은 두 개의 정수 배열이 주어졌을 때, 다음 식의 최댓값을 구하는 것이 목표입니다.|arr1[i] - arr1[j]| + |arr2[i] - arr2[j]| + |i - j|여기서 최댓값은 0 <= i, j < arr1.length 범위 내의 모든 인덱스 조합(i, j)에 대해 계산됩니다. 예를 들어 두 배열이 [1,2,3,4]와 [-1,4,5,6]으로 주어지면 결과는 13이 됩니다.접근 방식: 절댓값 전개이 문제를 효율적으로 풀기 위해서는 세 개의 절댓값을 수학적으로 전개하여 부호 조합별로 식을 재구성하는 것이
문제 설명두 개의 문자열 text1과 text2가 주어졌을 때, 두 문자열의 최장 공통 부분 수열(Longest Common Subsequence, LCS)의 길이를 반환하는 것이 이번 문제의 목표입니다.여기서 말하는 부분 수열(subsequence)이란 원본 문자열에서 일부 문자를 삭제하되, 남은 문자들의 상대적인 순서는 그대로 유지한 채 만들어진 새로운 문자열을 의미합니다. 예를 들어 abe는 abcde의 부분 수열이지만, 순서가 어긋난 adc는 부분 수열이 아닙니다.공통 부분 수열은 두 문자열 모두에 공통으로 등장하는 부분 수
문자열 text가 주어지고, 이 문자열 안에서 두 개의 문자를 딱 한 번 서로 교환(swap)할 수 있다고 가정해 봅시다. 이때 동일한 문자가 반복되는 가장 긴 부분 문자열(substring)의 길이를 구하는 것이 문제의 목표입니다. 예를 들어 입력이 ababa라면 결과는 3이 됩니다. 첫 번째 b와 마지막 a를 교환하거나, 마지막 b와 첫 번째 a를 교환하면 가장 긴 반복 문자열이 aaa가 되어 길이가 3이기 때문입니다. 접근 방법 및 알고리즘 이 문제는 슬라이딩 윈도우(sliding window) 기법과 문자 빈도수 계산을 조
연결 리스트의 헤드(head)가 주어졌을 때, 노드 값의 합이 0이 되는 연속된 노드 구간을 더 이상 존재하지 않을 때까지 반복적으로 삭제하는 문제를 생각해 봅시다. 모든 삭제 작업이 끝난 후에는 최종 연결 리스트의 헤드를 반환해야 합니다.예를 들어, 연결 리스트가 [1,2,-3,3,1]과 같다면, 2와 -3의 합이 0이므로 이 두 노드가 제거되고, 그 결과는 [3,1]이 됩니다.문제 해결 접근 방법이 문제는 누적 합(prefix sum)과 해시 맵(hash map)을 활용하면 효율적으로 해결할 수 있습니다. 알고리즘의 동작 과정은
이 글에서는 C++의 STL(표준 템플릿 라이브러리)을 활용해 다양한 병합(merge) 연산을 수행하는 방법을 알아보겠습니다.merge() 함수는 두 개의 정렬된 컨테이너를 하나로 합치되, 결과 컨테이너 역시 정렬된 상태를 유지하도록 병합합니다. 한편 includes() 함수는 첫 번째 컨테이너의 모든 요소가 두 번째 컨테이너 안에 포함되어 있는지 여부를 검사하는 데 사용됩니다.예제 코드#include<iostream> #include<algorithm> #include<vector> using na
이 튜토리얼에서는 C++의 연산자 오버로딩(Operator Overloading)을 활용하여 vector, map, pair의 내용을 손쉽게 출력하는 방법을 알아보겠습니다. 연산자 오버로딩이란 기존 연산자에 새로운 기능을 정의하여, 사용자가 정의한 객체(User-defined Object)에 대해서도 기본 타입처럼 자연스럽게 동작하도록 만드는 기능입니다. 이를 활용하면 cout << vec;처럼 컨테이너 전체를 한 줄로 깔끔하게 출력할 수 있습니다. 예제 코드 1. Vector 출력하기 vector<T> 타입
이 글에서는 C++에서 생성자(Constructor)와 소멸자(Destructor)가 호출되는 순서를 예제 코드와 함께 자세히 살펴보겠습니다.여기서 말하는 호출 순서란, 클래스 간 상속(Inheritance) 관계가 있을 때 각 클래스의 생성자와 소멸자가 어떤 패턴으로 실행되는지를 의미합니다. 핵심 규칙은 다음과 같습니다.생성자: 기반(부모) 클래스의 생성자가 먼저 호출된 후, 파생(자식) 클래스의 생성자가 호출됩니다.소멸자: 생성자와 정반대로, 파생 클래스의 소멸자가 먼저 실행되고 기반 클래스의 소멸자가 마지막에 호출됩니다.이러한
이 튜토리얼에서는 순서 있는 집합(Ordered Set)과 GNU C++ PBDS(Policy-Based Data Structures)에 대해 알아보겠습니다.순서 있는 집합이란?순서 있는 집합은 STL 라이브러리의 일반적인 컨테이너와 달리, GNU PBDS에서 제공하는 정책 기반(policy-based) 자료구조입니다. 일반적인 std::set과 마찬가지로 모든 요소를 정렬된 상태로 유지하며 중복 값을 허용하지 않지만, STL에는 없는 강력한 기능 두 가지를 추가로 제공합니다.find_by_order(k): k번째 인덱스(0부터 시
이번 튜토리얼에서는 C++ 프로그래밍에서 중요한 개념 중 하나인 출력 반복자(Output Iterator)에 대해 자세히 알아보겠습니다.출력 반복자란 무엇인가?C++에는 다섯 가지 주요 반복자 유형이 있습니다. 입력 반복자(Input Iterator), 출력 반복자(Output Iterator), 순방향 반복자(Forward Iterator), 양방향 반복자(Bidirectional Iterator), 임의 접근 반복자(Random Access Iterator)가 바로 그것입니다.그중 출력 반복자는 입력 반복자와 정반대로 동작합니다
C++에서 override 키워드는 객체 지향 프로그래밍의 핵심 개념인 다형성(polymorphism)을 구현할 때 매우 유용한 도구입니다. 이 글에서는 override 키워드가 무엇인지, 어떤 문제를 예방해 주는지, 그리고 실제 코드에서 어떻게 활용되는지 자세히 알아보겠습니다.override 키워드란?override 키워드는 파생 클래스(자식 클래스)가 기반 클래스(부모 클래스)의 가상 함수(virtual function)를 재정의한다는 것을 컴파일러에게 명시적으로 알려주는 역할을 합니다.만약 함수 시그니처(함수 이름, 매개변수,
C++ STL에서 pair란 무엇인가?이 글에서는 C++ 표준 템플릿 라이브러리(STL)의 pair에 대해 살펴보겠습니다.pair는 <utility> 헤더 파일에 정의된 컨테이너로, 두 개의 값을 하나의 단위로 묶어 관리할 수 있게 해줍니다. 특히 두 값의 자료형이 서로 달라도 문제없이 함께 저장할 수 있다는 점이 큰 장점입니다. pair의 첫 번째 값은 first, 두 번째 값은 second라는 멤버 변수를 통해 접근합니다.pair의 주요 특징두 개의 값을 하나의 객체로 저장하고 전달할 수 있습니다.각 값의 자료형이 서
C++ std::partition_point 함수란? 이 글에서는 C++ 표준 라이브러리(STL)의 partition_point 알고리즘에 대해 자세히 알아보겠습니다. std::partition_point는 <algorithm> 헤더에 정의된 함수로, 주어진 범위에서 조건자(predicate)가 처음으로 거짓이 되는 첫 번째 요소를 가리키는 반복자(iterator)를 반환합니다. 쉽게 말해, 이미 분할된 범위에서 두 그룹의 경계 지점을 찾아주는 역할을 합니다. 단, 이 함수가 정확하게 동작하려면 대상 범위가 해당 조건자를
이 튜토리얼에서는 C++를 사용하여 원형 세그먼트(circular segment)의 넓이를 구하는 방법을 알아보겠습니다.원형 세그먼트란?원 안에 하나의 현(chord)을 그으면 원은 두 개의 영역으로 나뉩니다. 바로 큰 세그먼트(major segment)와 작은 세그먼트(minor segment)입니다. 원의 반지름과 작은 세그먼트를 이루는 중심각이 주어졌을 때, 두 세그먼트의 넓이를 각각 계산해야 합니다.계산 공식세그먼트의 넓이는 다음과 같은 과정으로 구할 수 있습니다.부채꼴(sector)의 넓이 = π × r² × (θ / 36
이 튜토리얼에서는 입력받은 연도가 몇 번째 세기에 해당하는지 계산하는 C++ 프로그램을 살펴보겠습니다.프로그램의 목표는 하나의 연도 값이 주어졌을 때, 해당 연도가 속한 세기를 정확히 판별하는 것입니다. 예를 들어 2001년이 입력되면 21세기임을 알려주는 방식입니다.세기 계산 원리세기를 계산하는 기본 규칙은 다음과 같습니다.1년부터 100년까지는 1세기입니다.101년부터 200년까지는 2세기입니다.연도를 100으로 나눈 몫에, 나머지가 존재하면 1을 더한 값이 세기가 됩니다.즉, 연도가 100으로 나누어 떨어지면 year / 10
C++에서 삼각형의 외심(Circumcenter) 구하기 이 튜토리얼에서는 C++를 활용해 삼각형의 외심을 구하는 프로그램을 살펴봅니다. 외심은 삼각형의 세 꼭짓점으로부터 거리가 모두 같은 점으로, 세 변의 수직 이등분선이 만나는 지점입니다. 외심을 중심으로 하면 세 꼭짓점을 모두 지나는 원, 즉 외접원을 그릴 수 있습니다. 문제의 조건은 다음과 같습니다. 일직선상에 있지 않은(non-collinear) 세 점 P, Q, R이 주어질 때, 이 점들이 형성하는 삼각형의 외심 좌표를 계산하는 것이 우리의 과제입니다. 풀이 접근 방식 기
이 튜토리얼에서는 C++를 사용하여 원의 둘레(원주)를 구하는 프로그램을 다룹니다.프로그램에는 원의 반지름(radius)이 입력으로 주어집니다. 우리의 목표는 이 반지름 값을 이용해 해당 원의 둘레를 계산하고 화면에 출력하는 것입니다.원의 둘레 공식원의 둘레는 아래의 수학 공식으로 구할 수 있습니다.둘레 = 2 × π × r여기서 π(파이)는 약 3.1415이며, r은 원의 반지름입니다. C++에서는 매크로 상수로 π 값을 정의한 뒤 함수를 통해 둘레를 계산할 수 있습니다.예제 코드#include<bits/stdc++.h>
문제 개요HH:MM:SS 형식의 문자열로 표현된 두 시간 구간이 주어집니다. 여기서 HH는 시(hour), MM은 분(minute), SS는 초(second)를 나타냅니다. 이 두 시간 구간 사이의 차이를 동일한 문자열 형식으로 구하는 것이 이번 문제의 목표입니다.시간 구간 1 = 8:6:2 시간 구간 2 = 3:9:3 두 시간의 차이 = 4:56:59동작 원리시간 차이를 계산할 때는 일반적인 뺄셈과 마찬가지로 낮은 자리부터 비교하며, 필요한 경우 상위 자리에서 값을 빌려오는(자리내림) 방식을 사용합니다.초 단위 처리: 두 번째 시
이 글에서는 C++ STL의 map::emplace_hint() 함수에 대해 동작 방식, 구문, 그리고 실제 예제를 통해 자세히 살펴보겠습니다. C++ STL에서 맵(Map)이란? 맵(map)은 연관 컨테이너(associative container)로, 키(key)와 매핑된 값(mapped value)의 조합으로 이루어진 요소들을 특정 순서대로 저장할 수 있게 해줍니다. 맵 컨테이너 내부에서 데이터는 항상 연관된 키를 기준으로 자동 정렬되며, 각 값은 고유한 키를 통해서만 접근할 수 있습니다. map::emplace_hint()
이 글에서는 C++ STL의 map::emplace() 함수가 어떻게 동작하는지, 그 문법과 실제 사용 예제까지 자세히 알아봅니다. C++ STL에서 맵(Map)이란? 맵(map)은 연관 컨테이너(associative container)의 일종으로, 키(key)와 매핑된 값(mapped value)의 조합으로 이루어진 요소들을 특정 순서에 따라 저장할 수 있게 해주는 자료구조입니다. 맵 컨테이너의 데이터는 내부적으로 항상 연관된 키를 기준으로 자동 정렬되며, 저장된 값은 고유한 키를 통해서만 접근할 수 있습니다. map::empl