πŸ’  Cpp

[BOJ][C++] λ°±μ€€ 1004번: μ–΄λ¦° μ™•μž

선달 2024. 8. 12. 19:23
λ°˜μ‘ν˜•

https://www.acmicpc.net/problem/1004

 

문제

μ–΄λ¦° μ™•μžλŠ” μ†Œν˜Ήμ„± B-664μ—μ„œ μžμ‹ μ΄ μ‚¬λž‘ν•˜λŠ” ν•œ 솑이 μž₯λ―Έλ₯Ό μœ„ν•΄ μ‚΄μ•„κ°„λ‹€. μ–΄λŠ λ‚  μž₯λ―Έκ°€ μœ„ν—˜μ— λΉ μ§€κ²Œ 된 것을 μ•Œκ²Œ 된 μ–΄λ¦° μ™•μžλŠ”, μž₯λ―Έλ₯Ό κ΅¬ν•˜κΈ° μœ„ν•΄ μ€ν•˜μˆ˜λ₯Ό 따라 κΈ΄ 여행을 ν•˜κΈ° μ‹œμž‘ν–ˆλ‹€. ν•˜μ§€λ§Œ μ–΄λ¦° μ™•μžμ˜ μš°μ£Όμ„ μ€ κ·Έλ ‡κ²Œ 쒋지 μ•Šμ•„μ„œ 행성계 κ°„μ˜ 이동을 μ΅œλŒ€ν•œ ν”Όν•΄μ„œ μ—¬ν–‰ν•΄μ•Ό ν•œλ‹€. μ•„λž˜μ˜ 그림은 μ–΄λ¦° μ™•μžκ°€ 펼쳐본 μ€ν•˜μˆ˜ μ§€λ„μ˜ 일뢀이닀.

λΉ¨κ°„ 싀선은 μ–΄λ¦° μ™•μžκ°€ μΆœλ°œμ μ—μ„œ λ„μ°©μ κΉŒμ§€ λ„λ‹¬ν•˜λŠ”λ° μžˆμ–΄μ„œ ν•„μš”ν•œ 행성계 μ§„μž…/μ΄νƒˆ 횟수λ₯Ό μ΅œμ†Œν™”ν•˜λŠ” 경둜이며, 원은 ν–‰μ„±κ³„μ˜ 경계λ₯Ό μ˜λ―Έν•œλ‹€. μ΄λŸ¬ν•œ κ²½λ‘œλŠ” μ—¬λŸ¬ 개 μ‘΄μž¬ν•  수 μžˆμ§€λ§Œ 적어도 3번의 행성계 μ§„μž…/μ΄νƒˆμ΄ ν•„μš”ν•˜λ‹€λŠ” 것을 μ•Œ 수 μžˆλ‹€.

μœ„μ™€ 같은 μ€ν•˜μˆ˜ 지도, 좜발점, 도착점이 μ£Όμ–΄μ‘Œμ„ λ•Œ μ–΄λ¦° μ™•μžμ—κ²Œ ν•„μš”ν•œ μ΅œμ†Œμ˜ 행성계 μ§„μž…/μ΄νƒˆ 횟수λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•΄ 보자. ν–‰μ„±κ³„μ˜ 경계가 λ§žλ‹Ώκ±°λ‚˜ μ„œλ‘œ κ΅μ°¨ν•˜λŠ” κ²½μš°λŠ” μ—†λ‹€. λ˜ν•œ, μΆœλ°œμ μ΄λ‚˜ 도착점이 행성계 경계에 걸쳐진 경우 μ—­μ‹œ μž…λ ₯으둜 주어지지 μ•ŠλŠ”λ‹€.

μž…λ ₯

μž…λ ₯의 첫 μ€„μ—λŠ” ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ˜ 개수 Tκ°€ 주어진닀. κ·Έ λ‹€μŒ 쀄뢀터 각각의 ν…ŒμŠ€νŠΈμΌ€μ΄μŠ€μ— λŒ€ν•΄ 첫째 쀄에 좜발점 (x1, y1)κ³Ό 도착점 (x2, y2)이 주어진닀. 두 번째 μ€„μ—λŠ” ν–‰μ„±κ³„μ˜ 개수 n이 주어지며, μ„Έ 번째 쀄뢀터 n쀄에 걸쳐 ν–‰μ„±κ³„μ˜ 쀑점과 λ°˜μ§€λ¦„ (cx, cy, r)이 주어진닀.

좜λ ₯

각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ— λŒ€ν•΄ μ–΄λ¦° μ™•μžκ°€ 거쳐야 ν•  μ΅œμ†Œμ˜ 행성계 μ§„μž…/μ΄νƒˆ 횟수λ₯Ό 좜λ ₯ν•œλ‹€.

μ œν•œ

  • -1000 ≤ x1, y1, x2, y2, cx, cy ≤ 1000
  • 1 ≤ r ≤ 1000
  • 1 ≤ n ≤ 50
  • μ’Œν‘œμ™€ λ°˜μ§€λ¦„μ€ λͺ¨λ‘ μ •μˆ˜

풀이

// 풀이 : https://whkakrkr.tistory.com

#include <iostream>
#include <vector>

using namespace std;

int get_distance(int x1, int y1, int x2, int y2) {
    return (x1-x2)*(x1-x2) + (y1-y2)*(y1-y2);
}

int main() {
    ios_base::sync_with_stdio(false);
	cout.tie(NULL);
	cin.tie(NULL);

    int t;
    cin >> t;
    while(t--) {
        int x1,x2,y1,y2, n, cx,cy,r, ans=0;
        cin >> x1 >> y1 >> x2 >> y2 >> n;
        
        while(n--) {
            cin >> cx >> cy >> r;
            
            // 각 지점이 원 내뢀에 μžˆλŠ”μ§€ μ—¬λΆ€
            bool isStartIn = get_distance(x1, y1, cx, cy) <= r*r;
            bool isEndIn = get_distance(x2, y2, cx, cy) <= r*r;
            if(isStartIn != isEndIn) {
                ans++;
            }
        }
        
        cout << ans << "\n";
    }
    
    return 0;
}

 

μ‹œν–‰μ°©μ˜€

	if(isStartIn || isEndIn) {
                if(isStartIn && isEndIn) {
                    break;
                }
                ans++;
            }

 

μœ„ μ½”λ“œλ₯Ό μ•„λž˜ μ½”λ“œλ‘œ λ°”κΏ”μ„œ μ‹œκ°„μ΄ˆκ³Ό ν•΄κ²°

            if(isStartIn != isEndIn) {
                ans++;
            }
λ°˜μ‘ν˜•