분할정복 2

백준 1629: 곱셈 [C++]

https://www.acmicpc.net/problem/1629  큰 수의 곱셈 문제가 있을 때 떠올리면 좋은 건 분할정복과 비트마스킹이다.a를 b번 곱할 때 반복문으로 b번 곱하는 것이 아니라, 지수를 반으로 나눠서 거듭제곱하는 방식이다. 물론 이때 지수가 짝수이면 그냥 반 갈라도 되지만 지수가 홀수이면 1을 하나 빼서 나눈 뒤 마지막에 한번 더 곱해줘야 한다.처음에는 그냥 비트마스킹만 생각했는데 그럼 2의 거듭제곱만으로 계산해야 하니 귀찮았다.. 단 숫자가 아주 커질 수 있기 때문에 그냥 계산하면 오류가 날 수 있으므로 계산 과정에서 매번 c로 나눈 나머지를 사용하도록 해서 오버플로가 나지 않게 해준다. b & 1 이라는건 비트마스킹에서 첫번째 비트가 1인 수와 and를 했을 때 true 즉 0이 ..

알고리즘 2024.11.02

백준 1074: Z [C++]

https://www.acmicpc.net/problem/1074 일정한 규칙에 따라 정사각형의 칸을 방문한다.사각형 크기에 관계없이 언제나 Z 형태로 순서가 정해진다.좌표계의 2 - 1 - 3 - 4사분면 순서로 방문한다고도 볼 수 있다. (근데 구현할 때는 헷갈리니까 걍 1 2 3 4 순서라고 했다)결국 주어진 점이 각 2^n-1 사각형들로 나누어진 보드에서 몇사분면에 속해있느냐를 구하는 문제이다.단 한번만 구하는 게 아니라 가장 작은 사각형이 될때까지 찾아야 하므로 n부터 역순으로 반복문을 돌아주면 될 것이다. 몇번 사분면인지 구하는 함수그냥 정의 그대로 만들었다.typedef pair ci;int square(int n, int y, int x) { //주어진 좌표가 몇번 사분면에 있는지 i..

알고리즘 2024.07.11