백준 25406번 식사 계획 세우기
과반수를 넘는 음식이 있으면 먼저 먹고 아니면 가장 앞 번호를 먹는 규칙을 set과 우선순위 큐로 처리하기
주제
글 155개
과반수를 넘는 음식이 있으면 먼저 먹고 아니면 가장 앞 번호를 먹는 규칙을 set과 우선순위 큐로 처리하기
쿼리마다 선택된 노드끼리만 합치고 컴포넌트 크기로 쌍의 수 계산하기, 필요한 곳만 초기화
이미지로 남긴 프로그래머스 스킬체크 레벨 4 응시 결과와 짧은 소감
숫자를 i개, j개 써서 만든 값끼리 사칙연산으로 합쳐 i+j개의 값 집합을 만드는 DP
슬라이딩 윈도우의 알파벳 개수를 비교하고 해시로 중복을 걸러 애너그램 부분 문자열 세기
트리를 DFS로 내려가며 경로 문자열의 롤링 해시를 갱신해 패턴과 같은 경로 수 세기
롤링 해시와 이분 탐색으로 두 번 이상 나오는 부분 문자열의 최대 길이 찾기
정수 수열에 롤링 해시를 적용해 K번 이상 나오는 가장 긴 패턴 찾기, 충돌 시 직접 비교
S는 2, K는 -1로 바꾼 누적합에서 같은 값이 나오는 가장 먼 두 지점 찾기
원형 문자열을 두 번 이어 붙인 뒤 KMP로 일치하는 회전 수를 세어 확률로 바꾸기
KMP 실패 함수의 마지막 값으로 반복 단위 길이를 구해 문자열이 몇 번 반복되는지 판정하기
누적 XOR 값을 Trie에 넣고 각 값과 XOR이 최대가 되는 짝을 찾아 부분 수열 XOR 최댓값 구하기
prefix XOR 성질과 비트별 1의 개수 × 0의 개수로 모든 부분 수열 XOR 합 구하기
비트마다 1의 개수 × 0의 개수를 곱해 모든 쌍의 XOR 합 구하기
앞에서부터의 XOR 값이 4 주기로 반복되는 성질과 prefix XOR로 구간 XOR을 바로 구하기
0과 1만 있는 Trie에 수를 넣고 빼며, 높은 비트부터 반대 비트를 골라 XOR 최댓값 찾기
Trie를 얕은 쪽부터 출력하고 가장 긴 단어를 마지막에 남겨 백스페이스 횟수 줄이기
Trie 노드마다 자식 수의 팩토리얼을 곱해 이름 배열 수 구하기, 메모리 초과와 씨름한 기록
지울 파일과 남길 파일을 Trie에 표시해 한 번에 지울 수 있는 가장 높은 경로부터 지우기
색상은 Trie, 닉네임은 set에 넣고 쿼리를 두 부분으로 나눌 수 있는지 판정하기
Trie에 닉네임을 넣다가 처음 새로 생기는 접두사까지 출력하고, 같은 닉네임은 번호를 붙이기
단어가 끝나거나 자식이 둘 이상인 Trie 노드에서만 입력이 필요하다는 점으로 평균 입력 수 구하기
고른 숫자 집합과 현재 나머지를 상태로 두고, 큰 수 대신 나머지만 이어 붙이는 비트마스크 DP
두 경찰차가 마지막으로 맡은 사건 번호를 상태로 둔 DP와 어느 차가 맡았는지 역추적하기
소인수분해로 오일러 피 함수를 계산해 n 이하에서 n과 서로소인 수 세기, √n까지만 나누기
목표 문자열의 각 글자가 몇 개 진행됐는지 세며 순서대로 완성할 수 있는 개수 구하기
그래프를 뒤집고 진입 차수가 0인 노드를 지워 나가 사이클에 닿지 않는 노드 세기
구간 업데이트를 lazy 세그먼트 트리와 imos 차분 배열 두 가지로 풀고 도착 구간 계산하기
에라토스테네스의 체로 각 수의 가장 작은 소인수를 저장해 여러 수를 빠르게 소인수분해하기
가로 + 세로 - 최대공약수로 대각선이 지나는 타일 수 계산하기
순열을 사이클로 나누고 사이클 길이의 최소공배수로 원래대로 돌아오는 시점 구하기
나머지가 모두 같다는 조건을 이웃한 수 차이의 최대공약수와 그 약수 문제로 바꾸기
괄호가 겹치지 않는 모든 배치를 재귀로 만들고 식을 앞에서부터 계산하는 완전 탐색
정렬 뒤 각 원소가 최댓값으로 2^i번, 최솟값으로 2^(n-1-i)번 등장한다는 점을 이용한 합 계산
윗줄의 앉은 상태를 비트마스크로 두고 행 단위로 내려가며 최대 인원을 메모이제이션하는 DP
중간 돌을 거치는 비용 중 큰 값을 다시 최소로 만드는 DP, int 범위 주의
멀티탭이 가득 찼을 때 가장 늦게 다시 쓰이거나 다시 안 쓰이는 기기를 뽑는 그리디
K로 끝난 개구리와 P로 끝난 개구리 수를 세며 합쳐지는 규칙으로 필요한 최대 마리 수 구하기
SCC마다 사이클 하나를 만들고 SCC 사이를 잇되, 다른 경로로 대신할 수 있는 간선은 빼고 출력하기
SCC로 압축한 그래프에서 시작점에서 닿는 컴포넌트만 따라가며 방문 도시 수 최대화하기
SCC를 구해 진입 차수가 0인 SCC가 하나뿐일 때만 그 안의 노드를 시작 전술로 출력하기
SCC로 압축한 DAG에서 시작 SCC에서 닿는 경로만 따라가며 최대 현금을 구하는 DP
SCC로 압축한 그래프에서 나가는 간선이 없는 컴포넌트의 노드를 모두 출력하기
모든 정점의 차수가 짝수인지 확인하고 Hierholzer 알고리즘으로 간선을 한 번씩 쓰는 회로 만들기
위상 정렬로 최장 도착 시간을 구한 뒤 역방향으로 따라가며 임계 경로 간선 세기
위상 정렬 순서로 중간 부품의 기본 부품 필요량을 곱해 누적하기, 역추적으로 난 메모리 초과
이웃한 단어의 첫 차이로 알파벳 순서 간선을 만들고 위상 정렬로 모순과 여러 답 판정하기
기존 순위로 모든 쌍에 방향 간선을 만들고 바뀐 쌍만 뒤집어 위상 정렬로 최종 순위 구하기
건물 선행 관계를 위상 정렬로 풀어 목표 건물의 최소 완성 시간 구하기, 전역 배열 초기화 실수까지
위상 정렬 순서대로 선행 건물 완료 시간 중 가장 늦은 값에 자기 건설 시간을 더하기
진입 차수가 0인 문제를 최소 힙에 넣어 번호가 작은 문제부터 푸는 위상 정렬
DFS 후 역순으로 출력하는 위상 정렬과 방문 중 상태로 사이클 찾기
MST를 만들다 간선이 N-2개가 되면 멈춰 가장 비싼 간선을 빼고 마을을 둘로 나누기
시작점과 열쇠 사이 최단 거리를 BFS로 구해 간선으로 만들고 MST로 모두 잇기
x, y, z 좌표별로 정렬해 이웃한 행성 사이 간선만 후보로 두는 MST
위성 채널 수만큼 연결을 건너뛰고 MST에서 마지막으로 고른 간선 비용을 답으로 내기
양쪽 벽과 센서를 정점으로 짧은 간격부터 이어 두 벽이 연결되는 순간의 거리 찾기
1개 3원, 2개 5원, 3개 7원이라는 단가 차이로 앞쪽 공장과 묶어 사는 순서를 정하는 그리디
지연 시간이 짧은 도시부터 경유지로 허용하며 최단 거리와 경로상 최대 지연을 함께 갱신하기
플로이드 워셜로 사건 사이 도달 여부를 구해 앞뒤 관계를 판단하고 연결되지 않은 경우 구분하기
컴포넌트를 나누고 플로이드 워셜로 그룹마다 최대 전달 시간이 가장 작은 대표 고르기
음의 간선 때문에 다익스트라 대신 벨만 포드로 최단 거리와 음수 사이클을 판정, long long 필요
간선에서 비용을 빼고 도시에서 수익을 더하는 벨만 포드, 도착지까지 이어지는 양수 사이클 판정
벨만 포드로 찾은 양의 사이클 중 실제로 N까지 이어지는 것만 골라내고 경로 복원하기
포장한 도로 수를 상태로 둔 다익스트라, 방문 여부 대신 거리 비교로 오래된 항목을 거르는 것이 핵심
도로포장처럼 사용한 비용을 상태로 두고 비용별 최소 소요 시간을 기록하는 최단 경로
MST처럼 보이지만 1번 기준 다익스트라에서 각 노드의 부모 간선만 남기면 되는 문제
다익스트라 후 도착점부터 역추적해 모든 최단 경로 간선을 지우고 다시 다익스트라 돌리기
시작점, 대포, 목적지를 완전 그래프로 만들고 걷기와 대포 중 빠른 쪽으로 간선을 둔 다익스트라
티켓을 쓰기 전과 후로 그래프를 두 겹 만들고 비용 0인 간선으로 이은 다익스트라
f를 1, 2, 4, 8번 적용한 결과를 sparse table로 저장해 합성함수를 로그 시간에 계산하기
부모 선택 여부에 따라 현재 노드를 고를지 나누는 트리 DP와 선택된 노드 복원
자릿수와 1의 개수 제한별 경우의 수를 DP로 세고 앞자리부터 I번째 수를 만들어 가기
부모가 얼리어답터인지에 따라 현재 노드의 선택지를 나누는 트리 DP
왼쪽과 오른쪽으로 한 번씩 스위핑하며 자기보다 높은 별 수를 세어 곱하기, 같은 x좌표 처리 주의
더하기, 곱하기, 대입 쿼리를 ax+b 형태의 lazy 값 하나로 합성하는 세그먼트 트리
x좌표로 정렬하고 압축한 y좌표를 세그먼트 트리에 기록해 북서풍 조건을 만족하는 쌍 세기
합병 정렬의 중간 결과를 저장한 머지 소트 트리에서 upper_bound로 K보다 큰 원소 수 세기
머지 소트 트리로 구간에서 어떤 값 이하인 수의 개수를 구하고 이분 탐색으로 K번째 수 찾기
켜진 스위치 수와 반전 횟수를 lazy로 저장하고 홀수일 때만 뒤집는 구간 토글
구간 업데이트를 바로 반영하지 않고 표시만 해 두었다가 방문할 때 밀어 넣는 lazy propagation
결합·교환 법칙이 성립하는 XOR로 만든 세그먼트 트리와 lazy 전파, += 대신 ^=를 써야 하는 이유
값을 1, 0, -1로만 바꿔 곱하는 세그먼트 트리로 구간 곱의 부호 판정하기, EOF까지 입력받기
값 범위로 만든 세그먼트 트리에서 슬라이딩 윈도우의 K번째 값을 찾아 중앙값 합 구하기
구간 최솟값의 위치를 기준으로 좌우를 나누는 분할 정복, 히스토그램 문제와 같은 구조
실력을 좌표 압축하고 세그먼트 트리로 앞선 선수 중 자기보다 강한 사람 수 세기
A열 위치를 기계 번호로 기록하고 세그먼트 트리로 교차하는 연결선 수 세기, int 범위 주의
맛별 사탕 개수 합을 세그먼트 트리에 두고 순위를 따라 내려가며 원하는 사탕 찾기
구간 최솟값과 최댓값이 L과 R과 같은지 세그먼트 트리로 확인해 DVD가 제자리인지 판정하기
배열 앞쪽에 빈 자리를 비워 두고 DVD를 맨 위로 옮기며 세그먼트 트리로 위에 쌓인 개수 세기
구간의 나무 개수와 거리 합을 세그먼트 트리에 두고 새 나무를 심는 비용을 바로 계산하기
버블 소트 풀이에서 쿼리 순서만 1, N, 2, N-1로 바꿔 세그먼트 트리로 이동 횟수 세기
실제로 버블 정렬하지 않고 세그먼트 트리로 앞쪽의 정렬되지 않은 원소 수를 세어 swap 횟수 구하기
가장 낮은 막대를 기준으로 구간을 나누는 분할 정복, 최솟값 위치는 세그먼트 트리로 찾기
구간 합 대신 구간 곱을 저장하는 세그먼트 트리, 범위 밖이면 1을 반환하고 리프부터 다시 곱하는 업데이트
값을 바꾸는 대신 더하는 쿼리라는 점만 주의하면 되는 구간 합 세그먼트 트리
구간 최솟값 트리와 최댓값 트리를 따로 만들어 RMQ 질의에 답하기
남은 가장 큰 게이트에 도킹하는 그리디를 유니온 파인드로 빠르게 찾는 방법
끊길 간선을 빼고 먼저 합친 뒤 역순으로 다시 이으며 분할 비용을 더하기, long long 필요
구간 합 질의와 값 변경을 모두 O(log N)에 처리하는 세그먼트 트리 기본 구현
연결된 서랍 집합의 남은 자리를 루트에 저장하는 유니온 파인드로 술병 보관 여부 판단하기
수용량이 큰 간선부터 이어 붙이다 출발지와 도착지가 연결되는 순간의 수용량을 찾는 유니온 파인드
BFS로 문명을 넓히며 맞닿은 문명을 유니온 파인드로 합쳐 모두 이어지는 해 찾기
녹는 물을 BFS로 퍼뜨리며 이어진 물을 유니온 파인드로 묶어 백조가 만나는 날 찾기
O(N log N) LIS를 구하며 값이 갱신될 때마다 이전 원소를 기록해 실제 수열을 복원하는 방법
양 끝 문자가 같고 안쪽 구간이 팰린드롬이면 전체도 팰린드롬이라는 점화식으로 여러 질의 처리
팰린드롬 구간 판정 DP 위에 최소 분할 수 DP를 하나 더 쌓아 시간 초과 피하기
선분 교차 판정과 유니온 파인드를 합쳐 그룹 수와 가장 큰 그룹 크기 구하기
양발 위치와 진행 순서를 상태로 두고 최소 힘을 메모이제이션하는 DP
CCW 부호와 끝점 대소 비교로 일반 교차와 일직선 위에서 겹치는 경우까지 판정하기
메모리 대신 비용을 인덱스로 두고 비용별 최대 확보 메모리를 저장하는 배낭 DP
시작과 끝 행렬 구간을 상태로 두고 나누는 지점마다 곱셈 비용의 최솟값을 구하는 구간 DP
첫 집의 색을 고정하고 마지막 집이 그 색과 겹치지 않게 하는 원형 RGB 거리 DP
닭이 도울 수 있는 소가 여럿이면 가장 먼저 건너기를 끝내는 소를 고르는 그리디 매칭
친구비가 가장 싼 사람이 루트가 되도록 합치는 유니온 파인드로 집합별 최소 비용 더하기
부모 대신 루트를 저장하는 경로 압축 유니온 파인드의 union과 find 구현
이름을 번호로 바꾸고 루트에 음수로 집합 크기를 저장하는 유니온 파인드
가장 작은 두 묶음을 계속 합치는 최소 힙 그리디, C++ priority_queue를 최소 힙으로 쓰는 방법
최소 힙에서 꺼낸 곱에 소수들을 다시 곱해 넣으며 중복과 int 범위를 관리하기
최대 힙과 최소 힙의 크기 균형을 유지하며 입력마다 중앙값 출력하기
고른 소 집합의 최대 안정도를 비트마스크 DP로 기록하고 새 소를 위나 아래에 놓는 경우 비교
마지막으로 세운 학생과 지금까지 세운 학생 집합을 상태로 둔 비트마스크 DP, int 범위 초과 주의
현재 소유자, 구매 가격, 거쳐 간 예술가 집합을 상태로 둔 비트마스크 DP와 문제를 잘못 읽은 실수
가방 번호, 현재 가방 무게, 담은 보석 집합을 상태로 둔 비트마스크 DP
좌표 사이 유클리드 거리를 비용으로 쓰는 비트마스크 TSP, 소수점 출력 주의
마지막 글자와 사용한 단어 집합을 상태로 둔 비트마스크 DP로 최고 점수 구하기
켜진 발전소를 비트마스크로 두고 P개 이상 켜는 최소 비용을 메모이제이션하는 탑다운 DP
배정한 미션을 비트마스크로 두고 요원 순서대로 최대 성공 확률을 구하는 DP
말처럼 뛴 횟수를 BFS 상태에 넣어 벽 부수고 이동하기처럼 푸는 격자 최단 거리
현재 도시와 방문한 도시 비트마스크를 상태로 둔 외판원 순회 DP
지금까지 부순 벽의 수를 BFS 상태에 넣어 K번 이하로 부수는 최단 거리 구하기
낮과 밤, 부순 벽 수, 기다린 횟수를 BFS 상태로 기록해 밤에는 벽 앞에서 기다리는 최단 경로
열쇠 상태가 바뀌면 막혔던 칸과 테두리를 다시 탐색하는 BFS, visited 초깃값을 -1로 두는 이유
가진 열쇠를 비트마스크로 기록해 같은 칸이라도 열쇠 상태가 다르면 다시 방문하는 BFS
가진 보석 상태를 비트마스크로 두고 같은 섬, 같은 상태의 재방문을 막는 탐색
한 방향 밀기만 구현하고 보드를 돌려 네 방향을 처리, 변화 없는 이동과 가망 없는 분기 가지치기
길이, 마지막 숫자, 지금까지 쓴 숫자 비트마스크를 상태로 0~9를 모두 쓰는 계단 수 세기
흑백 칸을 나눠 놓을 자리를 절반으로 줄이고 대각선 점유를 기록하는 비숍 백트래킹
inorder와 postorder의 인덱스 범위만 넘기며 루트와 서브트리를 찾아 preorder 출력, 벡터 복사로 난 메모리 초과
크기별 5장 제한과 종이 범위를 확인하며 붙였다 떼는 백트래킹으로 최소 장수 찾기
각 원소를 넣거나 빼는 2^N 경우를 모두 도는 백트래킹, 벡터를 참조로 넘기면 22배 빨라지는 이유
모음 1개 이상, 자음 2개 이상 조건을 세며 알파벳을 고르는 백트래킹
이미 쓴 알파벳을 기록하며 상하좌우로 가는 DFS 백트래킹으로 가장 긴 경로 찾기
직전 줄의 최댓값과 최솟값만 남기는 DP로 4MB 메모리 제한 통과하기
행, 열, 3x3 칸에 쓴 숫자를 기록하며 빈칸을 채우는 백트래킹, 답은 한 번만 출력
수빈이가 짝수·홀수 초에 도달하는 시간을 따로 기록해 움직이는 동생과 만나는 순간 판정하기
금액별 최소 동전 수를 저장하는 DP, INT_MAX에 1을 더해 INT_MIN이 된 실수
퍼즐 상태를 문자열로 바꿔 map에 이동 횟수를 저장하는 BFS로 정답 상태까지의 최단 이동 찾기
불은 켜졌지만 아직 못 가는 방을 따로 기억했다가 길이 열리면 BFS에 넣기, 시작 방 불 켜기 주의
플레이어마다 큐를 따로 두고 각자 확장 거리만큼 번갈아 BFS를 돌려 점령 칸 세기
불이 번지는 시간을 먼저 BFS로 구하고 그보다 먼저 닿는 칸으로만 지훈이를 옮기기, 불이 없는 경우 주의
건물 범위를 벗어나지 않게 위아래 층으로 BFS 해서 최소 버튼 횟수 구하기
선택 그래프를 DFS로 따라가며 사이클을 이루는 학생만 팀으로 세고 나머지 인원 구하기
같은 키가 연속된 사람 수를 함께 저장하는 스택으로 서로 볼 수 있는 쌍 세기
왼쪽의 더 높은 탑 후보를 스택으로 관리해 각 탑의 레이저를 받는 탑 찾기