NOIP 2012 차량 여행 문제 해결: 양방향 연결 리스트와 이진 리프팅 최적화

문제 개요 NOIP 2012 심화 그룹의 '차량 여행' 문제는 두 운전자 A와 B가 번갈아 가며 동쪽(도시 번호가 증가하는 방향)으로 이동할 때의 경로를 시뮬레이션하고 최적의 출발지를 찾는 문제입니다. 운전 규칙: A가 먼저 운전하고 B가 다음에 운전하는 방식으로 번갈아 진행합니다. 도시 선택 기준: 운전자 B: 현재 도시와 해발 고도 차이의 절댓값이 가장 작은 도 ...

6월 8일 01:37에 게시됨

Java 알고리즘 풀이: 텐센트 2018 상반기 채용 기출 문제

문제 1: 교차 부호 수열의 합 길이 n의 연속된 정수 수열 1, 2, 3, ... n에 대해, 매 m개마다 부호를 교차시키는 수열을 정의합니다. 초기 부호는 음수(-)이며, 부호는 -, -, ..., +, +, -, -, ... 순서로 반복됩니다. 이때 처음 n개 항의 총합을 구하는 문제입니다. 입력 조건: 두 정수 n, m (2 ≤ n ≤ 10⁹, 1 ≤ m), n은 2m으로 나누어 떨어짐 출력: 처음 n개 항의 합 ...

6월 6일 22:56에 게시됨

CrCPC 2024 알고리즘 솔루션 가이드

문제 A: 인공지능의 종료 시나리오 이 문제는 상태 간의 전이를 효율적으로 관리하는 것이 핵심입니다. 주어진 값들의 분포를 압축하여 중복을 제거하고 (좌표 압축), 각 단계마다 가능한 최소 이동 횟수를 계산합니다. 전체적인 시간 복잡도는 로그 스케일을 가지므로 \(O(N \log N)\) 입니다. // 참조 구현 코드 #include <bits/stdc++.h> using namespace std; ...

6월 5일 01:01에 게시됨

C++ 다중 기준 정렬 구현 방법

이원 정렬의 개념 알고리즘 문제 풀이 과정에서 두 가지 이상의 데이터를 묶어서 정렬해야 하는 상황을 자주 접하게 됩니다. 예를 들어, 길이가 $n$인 두 수열 $A = \{a_1, a_2, \dots, a_n\}$과 $B = \{b_1, b_2, \dots, b_n\}$이 주어졌을 때, 먼저 $a_i$를 기준으로 오름차순 정렬하고, $a_i$ 값이 같다면 $b_i$를 기준으로 다시 오름차순 정렬하는 방식입니다. 이를 C+ ...

6월 4일 17:03에 게시됨

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월 1일 02:14에 게시됨

삽입 정렬(Insertion Sort)의 동작 원리와 성능 최적화

삽입 정렬은 정렬된 부분과 정렬되지 않은 부분으로 배열을 나누어, 정렬되지 않은 부분의 요소를 정렬된 부분의 적절한 위치에 '삽입'하는 방식의 알고리즘입니다. 1. 동작 원리와 루프 불변성 삽입 정렬의 핵심 아이디어는 루프 불변성(Loop Invariant)으로 설명할 수 있습니다. 길이 n인 배열 data에 대해, 인덱스 [0, i) 범위는 항상 정렬된 상태를 유지하며, 인덱스 ...

5월 29일 16:40에 게시됨

핵심 알고리즘 유형별 해결 방안과 코드 리팩토링

부제: 기본적인 수학 논리와 자료구조를 통한 효율적 설계 다음 내용은 특정 알고리즘 대회에서 자주 등장하는 4 가지 핵심 유형에 대한 접근법과 개선된 구현 예시를 다룹니다. 각 문제는 수학적 성질 검증, 그리디(Greedy) 할당, 해싱 기반 카운팅, 그리고 동적 계획법(DP) 과 재귀 탐색을 포함하고 있습니다. 1. 짝수 합분해 가능성 판정 목표: 주어진 양의 정수가 두 ...

5월 29일 00:49에 게시됨

최소 부분합 차이와 이진 트리 생성

부분합 차이 최소화 문제 주어진 배열에서 연속된 부분 수열의 합 차이를 최소화하고, 해당 조건을 만족하는 최대 길이를 찾는 문제입니다. O(n2) 복잡도의 단순 접근법은 모든 부분 수열을 계산하여 해결합니다. 최적화된 접근법은 다음과 같습니다: 배열의 누적 합을 계산 누적 합을 값 기준으로 정렬 (값이 동일할 경우 인덱스 내림차순) 인접한 누적 합 간의 차 ...

5월 27일 21:04에 게시됨

BIT(페니크 트리) 개념 정리 및 문제 풀이

BIT(페니크 트리) 개요 BIT(Binary Indexed Tree)는 구간 합을 빠르게 계산하고, 특정 인덱스의 값을 업데이트할 수 있는 자료구조입니다. lowbit 연산을 기반으로 하여 시간 복잡도 O(log N)을 보장합니다. P3374: 기본적인 BIT 연산 단일 값 갱신과 구간 합을 처리하는 가장 기초적인 템플릿 문제입니다. #include <bits/stdc++.h> using namespace std; int n ...

5월 26일 07:58에 게시됨

그리디 알고리즘 문제 풀이:柠檬水找零,身高重建队列,气球射箭

柠檬水找零 문제 입력과 응답 시나리오가 고정된 문제의 경우, 단순하게 구현하면 된다. 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에 게시됨