[Programmers] Lv2. 두 원 μ‚¬μ΄μ˜ μ •μˆ˜ 쌍 | C++

2023. 7. 3. 20:53ㆍCoding Test/Programmers

πŸ”—λ¬Έμ œ λ³΄λŸ¬κ°€κΈ°
 

ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€

μ½”λ“œ μ€‘μ‹¬μ˜ 개발자 μ±„μš©. μŠ€νƒ 기반의 ν¬μ§€μ…˜ 맀칭. ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€μ˜ 개발자 λ§žμΆ€ν˜• ν”„λ‘œν•„μ„ λ“±λ‘ν•˜κ³ , λ‚˜μ™€ 기술 ꢁ합이 잘 λ§žλŠ” 기업듀을 맀칭 λ°›μœΌμ„Έμš”.

programmers.co.kr

 

πŸ‘¨‍πŸ’»ν’€μ΄ κ³Όμ •

 

원은 μƒν•˜μ’Œμš° λŒ€μΉ­μ΄λ―€λ‘œ, 4개의 사뢄면 쀑 ν•˜λ‚˜μ— μ†ν•œ 점듀 개수만 κ΅¬ν•΄μ„œ 4λ°° ν›„, κ²ΉμΉ˜λŠ” 점 κ°œμˆ˜λ“€λ§Œ λΉΌμ£Όλ©΄ λ˜κ² λ‹€κ³  μƒκ°ν•˜μ˜€μŠ΅λ‹ˆλ‹€. μ €λŠ” 2사뢄면을 μ„ νƒν•˜μ—¬ μ§„ν–‰ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

 

제 2사뢄면 λ‚΄ 점 개수(3개) * 4 + κ²ΉμΉ˜λŠ” 점 개수(8개) = 20κ°œμž…λ‹ˆλ‹€.

 

μ•„λž˜ 과정은 제 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
λ°˜μ‘ν˜•