728x90
๐๋ฌธ์ ๋ณด๋ฌ๊ฐ๊ธฐ
๐จ๐ปํ์ด ๊ณผ์
์์ ์ํ์ข์ฐ ๋์นญ์ด๋ฏ๋ก, 4๊ฐ์ ์ฌ๋ถ๋ฉด ์ค ํ๋์ ์ํ ์ ๋ค ๊ฐ์๋ง ๊ตฌํด์ 4๋ฐฐ ํ, ๊ฒน์น๋ ์ ๊ฐ์๋ค๋ง ๋นผ์ฃผ๋ฉด ๋๊ฒ ๋ค๊ณ ์๊ฐํ์์ต๋๋ค. ์ ๋ 2์ฌ๋ถ๋ฉด์ ์ ํํ์ฌ ์งํํ์์ต๋๋ค.
์๋ ๊ณผ์ ์ ์ 2์ฌ๋ถ๋ฉด ๋ด์ ์ ๋ค ๊ฐ์๋ฅผ ๊ตฌํ๋ค๋ ๊ฐ์ ํ์ ์งํํ ๊ณผ์ ๋ค์ ๋๋ค.
- ์ฐ๋ฆฌ๋ ์ ์ ๋ถ๋ถ๋ง ํํด์ผ ํ๋ฏ๋ก, ํฐ ์์ y๊ฐ์ ๋ด๋ฆผ, ์์ ์์ y๊ฐ์ ์ฌ๋ฆผ ์ฒ๋ฆฌ๋ฅผ ํด์ผ ํฉ๋๋ค.
- [a, b] ๊ตฌ๊ฐ์ ์์ฐ์ ๊ฐ์๋ฅผ ๊ตฌํ๋ ๊ณต์์ b - a + 1์ ๋๋ค. (a ≤ b)
- ํฐ ์์ r1, ์์ ์์ r2๋ผ๊ณ ํ๋ฉด, r1.x \( \leq \) r2.x์ธ ๊ฒฝ์ฐ์๋ ํญ์ y = 0์ ์ ์ด ์๊น๋๋ค.
- r1.x - r2.x + 1์ด ๊ณง, -x ๋ฐฉํฅ์์์ y = 0 ์ ๊ฐ์๊ฐ ๋ฉ๋๋ค.
- ์ด๊ฒ์ -x ๋ฐฉํฅ, x ๋ฐฉํฅ, -y ๋ฐฉํฅ, y ๋ฐฉํฅ ๋ชจ๋ ๊ฐ๊ฒ ์ ์ฉ๋๋ฏ๋ก ๊ฒน์น๋ ์ ์ ์ด ๊ฐ์๋ (r1.x - r2.x + 1) * 4์ ๋๋ค.
- ํด๋น ๊ฐ์๋ฅผ ๋์ค์ ๋ํด์ฃผ๋ฉด ๋ฉ๋๋ค.
- r1.x > r2.x์ธ ๊ฒฝ์ฐ์๋ x < 0์ผ ๋๊น์ง ๊ฒน์น๋ ์ ์ด ๋ฐ์ํ์ง ์์ต๋๋ค.
- x < 0์ผ ๋๊น์ง ์ 2์ฌ๋ถ๋ฉด ๋ด์ ์ ๊ฐ์๋ฅผ ๋ค ๊ตฌํ๋ค๋ฉด, ํด๋น ์ ๊ฐ์๋ฅผ 4๋ฐฐํ ํ, ๊ฒน์น๋ ์ ์ ๊ฐ์๋ฅผ ๋ํด์ฃผ๋ฉด ๋ต์ด ๋ฉ๋๋ค.
โ๏ธ์์ค ์ฝ๋ ๋ฐ ๊ฒฐ๊ณผ
#include <cmath>
#include <algorithm>
using namespace std;
long long GetYValue(long long x, long long r, bool onCeil) {
double y = sqrt(r * r - x * x);
return onCeil ? ceil(y) : floor(y);
}
long long solution(int r1, int r2) {
if (r1 < r2) // r1์ด ๋ ํฐ ์์ด๋ผ๊ณ ๊ฐ์
swap(r1, r2);
long long answer = 0;
long long overlapPoints = (r1 - r2 + 1) * 4;
// 2์ฌ๋ถ๋ฉด ๋ด(x, y์ถ ์ ์ธ) ์ ๊ฐ์ ๊ตฌํ๊ธฐ
for (int x = -r1 + 1; x < 0; x++) {
long long r1Y = GetYValue(x, r1, false);
// x <= -r2์ธ ๊ฒฝ์ฐ์๋ y = 0 ์ ์ ์ ์ธ์ํค๋๋ก 1๋ก ์ค์
long long r2Y = (x > -r2) ? GetYValue(x, r2, true) : 1;
long long upperPointCount = r1Y - r2Y + 1;
answer += upperPointCount;
}
return answer * 4 + overlapPoints;
}
728x90
๋ฐ์ํ
'๐คAlgorithm > Programmers' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Programmers] Lv2. ํผ์์ ํ๋ ํฑํํ | C++ (0) | 2023.07.05 |
---|---|
[Programmers] Lv2. ์ซ์ ๋ธ๋ก | C++ (0) | 2023.07.04 |
[Programmers] Lv2. ์ฐ๋ฐ์์ด ์ ์ ๋ถ | C++ (0) | 2023.07.01 |
[Programmers] Lv2. ๋ํ์ค ๊ฒ์ | C++ (0) | 2023.07.01 |
[Programmers] Lv2. ํ ์ด๋ธ ํด์ ํจ์ | C++ (0) | 2023.07.01 |