Cute Running Puppy

algorithm/Programmers

[Programmers] 두 원 μ‚¬μ΄μ˜ μ •μˆ˜ 쌍(Python, Java)

R.silver 2024. 7. 4. 17:19
λ°˜μ‘ν˜•

πŸ“–λ¬Έμ œ

https://school.programmers.co.kr/learn/courses/30/lessons/181187

 

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

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

programmers.co.kr

 

βœ¨ν•΅μ‹¬ λ‚΄μš© 

두 원 μ‚¬μ΄μ˜ x, y μ’Œν‘œ λͺ¨λ‘ μ •μˆ˜μΈ 점의 개수 λ°˜ν™˜ν•˜κΈ° 
(각 μ›μœ„μ˜ 점도 μ„Έμ–΄μ•Ό ν•œλ‹€)

πŸ€”ν•΄κ²° 아이디어 

μœ ν˜•: μˆ˜ν•™

 

1. iλ₯Ό 1λΆ€ν„° r2κΉŒμ§€ λ°˜λ³΅ν•˜λ©° ν•΄λ‹Ή x μ’Œν‘œμ—μ„œμ˜ 원 1, 원 2의 y μ’Œν‘œλ₯Ό κ΅¬ν•œλ‹€ 

2. xκ°€ i 일 λ•Œ 두 원 사이 y κ°’μ˜ μ΅œλŒ€ 값은 math.sqrt(math.pow(r2, 2) - math.pow(i, 2))

3. xκ°€ i 일 λ•Œ 두 원 사이 y κ°’μ˜ μ΅œμ†Œ 값은 math.sqrt(math.pow(r1, 2) - math.pow(i, 2))

4. μ΅œλŒ€ κ°’κ³Ό μ΅œμ†Ÿκ°’ μ‚¬μ΄μ˜ μ •μˆ˜μ˜ 개수λ₯Ό μ„Έμ–΄ 더해주면 λœλ‹€ 

🟑 주의 ν•  점

1. 1μ‚¬λΆ„λ©΄μ˜ κ°’λ§Œ κ΅¬ν•œ λ’€ *4  ν•˜κΈ°

2. μΆ• μœ„μ˜ 값이 μ€‘λ³΅λ˜μ§€ μ•Šλ„λ‘ i의 λ²”μœ„λŠ” 1λΆ€ν„° μ‹œμž‘ν•˜κΈ°

3. a <= x <= bλ₯Ό λ§Œμ‘±ν•˜λŠ” μ •μˆ˜ x의 개수

    예) 1.2 <= x <= 5.4λ₯Ό λ§Œμ‘±ν•˜λŠ” μ •μˆ˜ x의 κ°œμˆ˜λŠ” 

          2 <= x <= 5 λ₯Ό λ§Œμ‘±ν•˜λŠ” μ •μˆ˜ x의 κ°œμˆ˜μ™€ λ™μΌν•˜λ‹€ 

    => math.floor(a) - math.ceil(b) + 1


βœ…μ •λ‹΅ μ½”λ“œ (Python)

import math
def solution(r1, r2):
    ans = 0

    for i in range(1, r2 + 1):
        # i 보닀 r1이 μž‘μ•„ mn의 값이 μŒμˆ˜κ°€ λ˜λŠ” 것 방지
        if i <= r1:
            mn = math.sqrt(math.pow(r1, 2) - math.pow(i, 2))
        else:
            mn = 0

        mx = math.sqrt(math.pow(r2, 2) - math.pow(i, 2))

        ans += (math.floor(mx) - math.ceil(mn) + 1)

    ans *= 4

    return ans

 

βœ…μ •λ‹΅ μ½”λ“œ (Java)

package programmers.lv2;
import java.util.*;

public class 두_원_μ‚¬μ΄μ˜_μ •μˆ˜_쌍 {

    class Solution {
        public long solution(int r1, int r2) {
            long ans = 0;

            // x: i일 λ•Œ r1원 λ‚΄λΆ€μ˜ μ •μˆ˜μ˜ 개수
            // cnt = Math.floor((Math.sqrt(Math.pow(r1, 2) - Math.pow(i, 2))))

            for (int i = 1; i <= r2; i++) {
                double mn = Math.sqrt(Math.pow(r1, 2) - Math.pow(i, 2));
                double mx = Math.sqrt(Math.pow(r2, 2) - Math.pow(i, 2));

                ans += (long)Math.floor(mx) - (long)Math.ceil(mn) + 1;
            }
            ans *= 4;

            return ans;
        }
    }
}

 

 

 

 

λ°˜μ‘ν˜•