1. 숫자 연결하기 (BOJ 1323)
pigeonhole principle
언제 한번 순환소수 구할 때 나눗셈을 해본 적이 있다면 좋은 아이디어를 떠올릴 수 있다.
1. 수를 계속 추가하면서(순환소수라면 0이었고, 이 문제에서는 N이다.) K로 나눠서 나머지를 알아낸다. 그후 그 나머지+N(여기선 문자열 연산이라 생각)을 다시 합쳐서 K로 나눈다.
2. 계속 하다보면 언젠가 반복되었다.
즉, 예제를 생각해보면 2%9=2 -> 22%9 -> 42%9 -> 62%9 -> ... 이런 식으로 계속 연산해준다. K로 나눈 나머지는 반드시 0~K-1이므로 비둘기집 원리에 따라 최대 K번 안에 반복된다. 같은 나머지가 나왔는데도 나머지가 0으로 안 나온다면 영원히 못 나누므로 -1을 출력하고 아니면 횟수를 출력하면 된다. 같은 수가 나오는 지 판별은 간단하게 해시를 사용했다.
2. Division Expression (BOJ 3397)
greedy, euclidean
(1/2/(2/3)) 같은 겹괄호는 안되고, 괄호를 이용해서 주어진 식을 정수로 만들어야 한다.
일단 괄호를 어떻게든 씌워도 반드시
3. Look Up (BOJ 6105)
stack
배열을 차례대로 확인하면서 안에 있는 값이 현재의 값보다 작다면 계속 스택에서 빼주면서 빼주는 값들이 있던 인덱스를 확인하여 현재 인덱스를 저장하면 된다. 이미 이러한 monotone stack 문제는 잘 알려져 있다.
4. 핑거 스냅 (BOJ 17394)
bfs, sieve
현재 노드가 있다면 1/3, 1/2, +1, -1의 노드를 방문 체크하면서 bfs를 돌려주면 된다. 만약 현재 노드가 A 이상 B 이하면 그 값이 소수인지 확인하고 핑거 스냅의 최솟값을 갱신해준다.
5. 곱하기와 쿼리 (BOJ 28421)
number theory
1번 질의의 경우
6. 팩토리얼 분수 방정식 (BOJ 13723)
number theory
이는 약수의 개수와 동치다.
7. 알렉산드리아의 디오판토스 (BOJ 7516)
number theory
위의 문제보다 더 쉬운 문제.
8. 짱해커 이동식 (BOJ 25603)
parametric search
현재 인덱스를 idx라고 하면 min(arr[idx:idx+k])을 찾고 이 값들 중에서 가장 큰 값이 답이다. 그리고 이 값이 있는 idx의 바로 다음부터 다시 k개의 구간을 idx+k가 n을 벗어나지 않을때 까지 반복해준다. 구간에서 최솟값을 찾는건 여러가지인데 생각이 안나서 그냥 세그로 O(logn)에 찾아줬다.
한편으로 파이썬에서 배열을 그대로 복사해서 min 값을 찾아주는게 세그보다 더 빠르다는 것을 찾아냈다. 데이터가 부족한거 같아서 데이터 추가 요청을 했다.
'BOJ' 카테고리의 다른 글
골드 이상 풀이 정리 1주차 (0) | 2024.10.27 |
---|---|
[BOJ][Python] 백준 32454번 - Fibonacci Lucky Numbers (0) | 2024.10.25 |
[BOJ][Python] 백준 32242번 - |
2024.09.19 |
랜덤 마라톤 14주차 (0) | 2024.09.05 |
[BOJ][Python] 백준 3653번 - 영화 수집 (0) | 2024.06.30 |