๋ณธ๋ฌธ์œผ๋กœ ๋ฐ”๋กœ๊ฐ€๊ธฐ
728x90
๐Ÿ”—๋ฌธ์ œ ๋ณด๋Ÿฌ๊ฐ€๊ธฐ
 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

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
๋ฐ˜์‘ํ˜•