문자열 동적 계획법: 부분 수열 카운팅, 삭제 연산, 그리고 편집 거리 최적화
1. 서로 다른 부분 수열의 개수 구하기
두 개의 문자열 text와 pattern이 주어졌을 때, text의 부분 수열 중 pattern과 일치하는 경우의 수를 계산하는 문제입니다. 부분 수열이란 원본 문자열에서 문자의 상대적 순서를 유지한 채 일부 문자를 제거하여 만들 수 있는 새로운 문자열을 의미합니다. 결과값은 32비트 부호 있는 정수 범위를 보장합니다.
class Solution {
pu ...
6월 16일 02:33에 게시됨
C++ STL 알고리즘 완전 정복
1. 비수정 시퀀스 알고리즘
이 알고리즘들은 컨테이너의 요소를 변경하지 않고 조작합니다.
1.1 find 및 find_if
find(begin, end, value): value와 첫 번째로 일치하는 요소를 찾아 반복자를 반환합니다 (찾지 못하면 end 반환).
find_if(begin, end, predicate): 조건자를 만족하는 첫 번째 요소를 찾습니다.
find_end(begin, end, sub_begin, sub_end): 서브시퀀스 ...
6월 15일 00:03에 게시됨
여러 언어로 Hello World 출력하기
실행 환경: macOS
IDE: VSCode + CodeRunner
C
hello_c.c
#include <stdio.h>
int main(void)
{
puts("안녕하세요, C입니다!");
return 0;
}
실행 명령어
gcc hello_c.c -o hello_c && ./hello_c
C++
hello_cpp.cpp
#include <iostream>
int main() {
std::cout << "안녕하세요, C++입니다!" << std: ...
6월 14일 00:58에 게시됨
ABC363 문제 풀이
A - 값의 범위
주어진 값 r이 어느 범위에 속하는지 확인하고, 그 범위의 상한에서 r을 뺀 값을 출력하면 된다.
100 미만이면 100-r, 200 미만이면 200-r, 300 미만이면 300-r을 출력한다.
코드 확인하기
#include<bits/stdc++.h>
using namespace std;
int main() {
int r;
cin >> r;
if(r < 100) {
cout << 100 - r;
...
6월 13일 16:20에 게시됨
고대 수학 지식을 활용한 비트 연산 최적화
결합 법칙의 중요성은 컴퓨팅에서 매우 크며, 특히 고성능 계산 및 암호학 분야에서 중요한 역할을 합니다. 이 글에서는 결합 법칙을 이용하여 비트 조작을 최적화하는 방법과 이를 C++에서 구현하는 예제를 다룹니다.
유한체 지수 연산 (모듈로 지수 연산)
공개 키 암호화 알고리즘인 RSA와 Diffie-Hellman에서 핵심적인 연산입니다. 모듈로 곱셈을 반복 적용하여 큰 수 ...
6월 12일 17:02에 게시됨
행렬 곱셈과 고속 지수 연산
행렬의 기초
기본 개념
행렬은 행과 열로 구성되는 2차원 배열이다. n×m 행렬은 n개의 행과 m개의 열을 가진 구조를 의미한다.
두 행렬을 곱할 때는 첫 번째 행렬의 열 개수와 두 번째 행렬의 행 개수가 반드시 일치해야 한다. 예를 들어, 2×3 행렬과 3×4 행렬을 곱하면 결과는 2×4 행렬이 된다.
[A_{a \times n} \times B_{n \times m} = C_{a \times m}]
행렬 곱셈의 ...
6월 11일 19:01에 게시됨
동적 계획법을 활용한 상태 머신 기반 문제 해결 전략
동적 계획법(Dynamic Programming)에서 상태 머신(State Machine) 개념을 도입하면 복잡한 의사결정 과정을 간결한 상태 전이 방정식으로 변환할 수 있습니다. 각 단계에서의 선택지를 상태로 정의하고, 이전 상태로부터 현재 상태로 도달하는 최적 경로를 계산하는 세 가지 사례를 살펴봅니다.
1. 인접한 항목을 선택할 수 없는 경우 (도둑 문제)
연속된 상점을 ...
6월 10일 16:04에 게시됨
C++ 표준 템플릿 라이브러리(STL) 핵심 알고리즘 가이드
1. 비수정 시퀀스 알고리즘
컨테이너의 데이터를 변경하지 않고 탐색이나 비교 작업을 수행하는 알고리즘입니다.
find, find_if, find_end
find: 특정 값과 일치하는 첫 번째 요소를 찾습니다.
find_if: 조건(서술자)을 만족하는 첫 번째 요소를 찾습니다.
find_end: 대상 범위 내에서 특정 서브 시퀀스가 마지막으로 나타나는 위치를 반환합니다.
vector&l ...
5월 26일 23:29에 게시됨
C++로 구현하는 상태 패턴: 객체의 동적 행동 전환
상태 패턴의 개념과 주요 응용 분야
상태 패턴은 행위 디자인 패턴 중 하나로, 객체 내부의 상태 변화에 따라 그 행동을 동적으로 변경할 수 있게 해줍니다. 이 패턴은 마치 객체가 클래스 자체를 바꾼 것처럼 보이게 하며, 조건문 기반의 복잡한 제어 흐름을 캡슐화하여 코드의 유지보수성과 확장성을 높입니다. 대표적인 적용 사례로는 주문 처리 시스템(예: 결제 대기, ...
5월 26일 13:06에 게시됨
그리디 알고리즘 문제 풀이:柠檬水找零,身高重建队列,气球射箭
柠檬水找零 문제
입력과 응답 시나리오가 고정된 문제의 경우, 단순하게 구현하면 된다.
class Solution {
public:
bool lemonadeChange(vector<int>& bills) {
unordered_map cash;
for(int i = 0;i < bills.size();i++){
int change = bills[i] - 5;
if(change == 0){
cash[bills[i]]++;
...
5월 26일 00:32에 게시됨