AC 자동기와 Luogu 문제 해결: P3808 및 P3796

AC 자동기概述 AC 자동기(Aho-Corasick Automaton)는 여러 개의 패턴을 동시에 검색할 때 사용하는高效的인 알고리즘이다. KMP 알고리즘의 확장판이라고 볼 수 있으며, Trie 트리와 실패 함수(Failure Function)를 결합하여 구현한다. 이 알고리즘은 텍스트 하나에서 여러 개의 패턴이 등장하는 횟수를 모두 찾을 수 있다. 문제介绍 본 article에서는 Luogu의 두 가지 ...

6월 21일 00:20에 게시됨

C# 해시 테이블을 활용한 알고리즘 문제 해결 및 최적화 기법

242. 유효한 애너그램 (Valid Anagram) 두 문자열이 서로 애너그램 관계인지 확인하는 문제입니다. 애너그램이란 문자의 순서만 다르고 구성 문자와 그 개수가 동일한 경우를 의미합니다. 최적화된 구현 문자열의 길이가 다르면 애너그램이 될 수 없으므로 조기 반환(Early Return)을 적용합니다. 또한, 소문자 알파벳으로만 구성된다는 제약 조건이 있으므로 해시 테이블 ...

6월 20일 05:26에 게시됨

알고리즘 문제 해결 및 코드 구현

트리의 깊이 우선 탐색 순서 최적화 주어진 트리에서 각 노드는 고유한 가중치를 가지고 있으며, 루트 노드는 1번입니다. DFS 순서에서 짝수 위치에 있는 노드들의 가중치 합을 최대화하는 것이 목표입니다. 문제 해결 방법 이 문제는 트리형태의 동적 프로그래밍(DP)으로 접근할 수 있습니다. 각 서브트리가 제공할 수 있는 최대 점수를 계산하며 진행합니다. 서브트 ...

6월 19일 22:53에 게시됨

2025년 2월 셋째 주 알고리즘 훈련 요약

알고리즘 훈련 주간 리뷰 (2.17 ~ 2.23) 훈련 종료 및 소감 겨울 방학 동안 진행된 알고리즘 훈련이 이번 주를 끝으로 종료되었습니다. 전반적인 훈련 성과는 아쉬운 수준이었으며, 집중력 저하가 두드러졌습니다. 자택 환경에서는 자연스럽게 느슨해지는 경향이 있었고, 학교 내에서의 학습 효율성에 비하면 현저히 떨어졌습니다. 개학 이후에는 이러한 태도를 개선하고 ...

6월 19일 20:22에 게시됨

ABC362 문제 해설

A 문제 문제는 매우 간단합니다. 세 정수 r, g, b와 문자열 c가 주어집니다. c가 "Red"이면 g와 b 중 최솟값을, "Blue"이면 r와 g 중 최솟값을, 그 외의 경우 r와 b 중 최솟값을 출력하면 됩니다. 코드 보기 #include<bits/stdc++.h> using namespace std; int main(){ int red, green, blue; string color; cin >> red > ...

6월 19일 01:43에 게시됨

연결 리스트 알고리즘 문제 풀이

연결 리스트 요소 제거 문제 설명: 주어진 연결 리스트에서 특정 값을 가진 모든 노드를 제거하는 문제이다. 解题 전략: 노드를 삭제할 때 현재 노드의 next 포인터를 다음 노드의 next로 변경하면 된다. C++을 사용하므로 메모리 해제도 반드시 처리해야 한다. 더미 노드를 사용하면 헤드 노드의特殊性한 경우를 처리할 필요가 없어져 코드가 간단해진다. 구현 코드: ...

6월 17일 19:49에 게시됨

:NOIP 시뮬레이션 경진대회 문제 풀이

T1 다채로운 색상 문제는 다음과 같습니다: nxm 크기의 행렬이 주어집니다. (i,j) 위치에는 색깔 ci,j가 있습니다. 네 모서리의 색상이 모두 동일하지 않은 모든 하위 행렬의 수를 구하세요. 시간 복잡도 O(n²m)으로 해결할 수 있습니다. 두 행을 선택한 뒤 열을 스캔하면서 해당 열의 값들이 같으면 답에 기여할 가능성이 있습니다. 이를 위해 카운트 배열을 ...

6월 17일 19:19에 게시됨

CF486B 문제 풀이 - 행렬 OR 연산 검증

문제 분석 본 문제는 두 개의 n×m 이진 행렬 A와 B가 주어졌을 때, B 행렬이 특정 규칙에 따라 A 행렬로부터 생성되었는지 확인하는 문제이다. 생성 규칙: B[i][j]는 A 행렬의 i번째 행 전체와 j번째 열 전체에 대해 OR 연산을 수행한 결과값이다. OR 연산의 특성을 먼저 파악해야 한다: 0|0 = 0 0|1 = 1 1|0 = 1 1|1 = 1 핵심 관찰 OR 연산의 특성을 통해 두 가지 ...

6월 17일 01:34에 게시됨

Codeforces 라운드 187 문제 해설

A. 상자 탑 쌓기 같은 크기의 상자만 존재하므로 각 상자가 견딜 수 있는 최대 상자 수를 계산하면 된다. 이 값을 c로 표기하면, 최대 스택 높이는 c+1이 된다. 전체 상자 수 n을 나누어 최소한의 스택 수를 계산한다. 코드 보기 <!-- 깊은 어둠을 바라보는 자, 어둠도 그를 바라보리라 --> #include <bits/stdc++.h> using namespace std; int main() { ...

6월 15일 17:04에 게시됨

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에 게시됨