수열의 D[a]부터 D[b]까지 숫자에 각각 Fib(1)부터 Fib(b-a+1)까지 더하는 쿼리를 많이 실행하는 문제였다.
(정수 N의 십진법 하위의 0의 개수) = min((N의 소인수 중 2의 개수), (N의 소인수 중 5의 개수)) 이다. 이것이 최소가 되는 방법은 두 개로 나뉜다. 2의 개수가 최소거나 5의 개수가 최소거나. 이렇게 두 번 연산하면 된다.
이동은 뒤로 하지 않는다는 사실로 인해 총 이동은 (마지막에 캔 돌의 위치) - 1만큼 한다는 것을 알 수 있다. 이걸 이용해 힙으로 최댓값을 기록하며 푼다
자료형에 데이터를 넣거나 최댓값/최솟값을 빼는 걸 모두 O(log N)에 해야 하는 문제이다.최댓값과 최솟값을 관리하는 힙을 각각 운영하는데, 여기서 서로 반대의 빼는 연산에서 최댓/최솟값이 날라가는걸 감지하기 위해 map을 사용한다.
이거 그냥 시작좌표랑 도착좌표 중 어느 하나는 원 안에 들어가있고 나머지 하나는 원 밖에 있는 원들의 개수를 세면 끝난다. 근데 나는 드럽게 어렵게 풀었다
소수의 연속합의 개수를 구하는 문제이다. 에라토스테네스의 체로 소수를 구해 vector에 넣은 후 투 포인터로 연속합의 개수를 세었다.
두 수의 최대공약수를 구하는 문제인데 두 수가 여러 수로 쪼개져 주어진다.사실 이 문제는 아주 간단한 이중 for문으로 풀리는 문제이다. 그런데 나는 이걸 더 빠른 방법으로 풀겠다고 30줄이면 푸는 문제를 100줄짜리 코드로 뻘짓을 하였다.
기하 문제이다. 입력은 이동 방향과 이동 거리로 주어지는데 그걸 점 좌표로 변환한 뒤 모든 점들의 최대 최소 X Y 좌표를 구해 그 어느 최대최소 X Y에도 매칭되지 않는 점을 찾아 그 점을 기준으로 구했다.
BFS 비슷한 것을 하는 문제이다. 효율성을 위해 메모이제이션을 사용해야 하고, 범위 검사를 꼼꼼하게 해야 하는 문제이다.알고리즘을 풀 때 한정으로 goto를 쓰면 꽤 편한 것 같다.
쓸 수 있는 숫자가 제한되어 있는 상태로 어떤 수와 가장 가까운 수를 찾는 문제이다. 선형 탐색으로 찾을 수 있지만 나는 더 성능이 좋은 방법으로 풀기 위해 재귀를 사용해 풀기로 했다.
덱을 활용하는 문제였다.입력과 출력 데이터가 더러워서 그런지 코드가 매우 더럽다.R이 입력되었을 때 실제로 배열을 뒤집지 말고 bool 값을 뒤집어 주면 된다. 그리고 bool 값에 따라 pop_back 또는 pop_front 를 한다.
D[i][j] = 0부터 i번째 포도주까지의 범위에서 포도주를 선택해 마셔 마지막으로 i번쨰 포도주를 연속 2-j개째로 마심으로 인해 마신 총 포도주의 양
정렬 문제이다. pair을 잘 쓰면 정렬할 때 함수를 별도로 작성하지 않아도 된다는 걸 깨달아 글을 작성하였다.