π•ƒπ•¦π•„π•šπ•£

γ€ŒβŒ¨οΈα΄„s」PS/λ°±μ€€_κΈ°ν•˜

[Baekjoon/λ°±μ€€][1002][C/C++] ν„°λ ›

by λ£¨λ°€π•ƒπ•¦π•„π•šπ•£2023. 1. 18.
728x90
λ°˜μ‘ν˜•
γ€Žλͺ©μ°¨γ€
0. κ°œμš”

1. 문제
2. 풀이
3. μ½”λ“œ

0. κ°œμš”

터렛을 κ°€μž₯ν•œ, 두 μ›μ˜ μœ„μΉ˜κ΄€κ³„λ₯Ό λ¬»λŠ” λ¬Έμ œμ΄λ‹€. μ§€λ¬Έμ—λŠ” 4λͺ…μ˜ 인물 '이석원, μ‘°κ·œν˜„, λ°±μŠΉν™˜, λ₯˜μž¬λͺ…'이 λ“±μž₯ν•˜λŠ”λ°, 이석원은 μ•„λ¬΄λŸ° 역할을 ν•˜μ§€ μ•ŠλŠ”λ‹€...(?!) μ‘°κ·œν˜„κ³Ό λ°±μŠΉν™˜μ€ μ›μ˜ 쀑심을 λ‚˜νƒ€λ‚΄κ³ , λ₯˜μž¬λͺ…κΉŒμ§€μ˜ κ±°λ¦¬λŠ” μ›μ˜ λ°˜μ§€λ¦„μ„ λ‚˜νƒ€λ‚΄λŠ”λ° 말이닀. ν•™μ°½ μ‹œμ ˆμ— κ³΅λΆ€ν•œ 두 μ›μ˜ μœ„μΉ˜κ΄€κ³„λ₯Ό λ– μ˜¬λ¦¬λ©΄ λ¬Έμ œλŠ” μ‰½κ²Œ ν’€λ¦°λ‹€. 잘 λͺ¨λ₯΄κ² μœΌλ©΄, 두 μ›μ˜ μœ„μΉ˜κ΄€κ³„μ— λŒ€ν•΄ ꡬ글링을 ν•΄λ³΄μž. 기얡이 μƒˆλ‘μƒˆλ‘ λ‚  것이닀.

1. 문제

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

 

1002번: ν„°λ ›

각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ§ˆλ‹€ λ₯˜μž¬λͺ…이 μžˆμ„ 수 μžˆλŠ” μœ„μΉ˜μ˜ 수λ₯Ό 좜λ ₯ν•œλ‹€. λ§Œμ•½ λ₯˜μž¬λͺ…이 μžˆμ„ 수 μžˆλŠ” μœ„μΉ˜μ˜ κ°œμˆ˜κ°€ λ¬΄ν•œλŒ€μΌ κ²½μš°μ—λŠ” -1을 좜λ ₯ν•œλ‹€.

www.acmicpc.net

[문제]

μ‘°κ·œν˜„κ³Ό λ°±μŠΉν™˜μ€ 터렛에 κ·Όλ¬΄ν•˜λŠ” 직원이닀. ν•˜μ§€λ§Œ μ›Œλ‚™ 쑴재감이 μ—†μ–΄μ„œ μΈκ΅¬μˆ˜λŠ” μ°¨μ§€ν•˜μ§€ μ•ŠλŠ”λ‹€. λ‹€μŒμ€ μ‘°κ·œν˜„κ³Ό λ°±μŠΉν™˜μ˜ 사진이닀.

λ°±μ€€ 1002 ν„°λ ›
λ°±μ€€ 1002 ν„°λ ›

이석원은 μ‘°κ·œν˜„κ³Ό λ°±μŠΉν™˜μ—κ²Œ μƒλŒ€νŽΈ 마린(λ₯˜μž¬λͺ…)의 μœ„μΉ˜λ₯Ό κ³„μ‚°ν•˜λΌλŠ” λͺ…령을 λ‚΄λ Έλ‹€. μ‘°κ·œν˜„κ³Ό λ°±μŠΉν™˜μ€ 각각 μžμ‹ μ˜ ν„°λ › μœ„μΉ˜μ—μ„œ ν˜„μž¬ μ κΉŒμ§€μ˜ 거리λ₯Ό κ³„μ‚°ν–ˆλ‹€.

μ‘°κ·œν˜„μ˜ μ’Œν‘œ (x1, y1)와 λ°±μŠΉν™˜μ˜ μ’Œν‘œ (x2, y2)κ°€ 주어지고, μ‘°κ·œν˜„μ΄ κ³„μ‚°ν•œ λ₯˜μž¬λͺ…κ³Όμ˜ 거리 r1κ³Ό λ°±μŠΉν™˜μ΄ κ³„μ‚°ν•œ λ₯˜μž¬λͺ…κ³Όμ˜ 거리 r2κ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ, λ₯˜μž¬λͺ…이 μžˆμ„ 수 μžˆλŠ” μ’Œν‘œμ˜ 수λ₯Ό 좜λ ₯ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

[μž…λ ₯]

첫째 쀄에 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ˜ 개수 Tκ°€ 주어진닀. 각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λŠ” λ‹€μŒκ³Ό 같이 이루어져 μžˆλ‹€.

ν•œ 쀄에 x1, y1, r1, x2, y2, r2κ°€ 주어진닀. x1, y1, x2, y2λŠ” -10,000보닀 ν¬κ±°λ‚˜ κ°™κ³ , 10,000보닀 μž‘κ±°λ‚˜ 같은 μ •μˆ˜μ΄κ³ , r1, r2λŠ” 10,000보닀 μž‘κ±°λ‚˜ 같은 μžμ—°μˆ˜μ΄λ‹€.

[좜λ ₯]

각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ§ˆλ‹€ λ₯˜μž¬λͺ…이 μžˆμ„ 수 μžˆλŠ” μœ„μΉ˜μ˜ 수λ₯Ό 좜λ ₯ν•œλ‹€. λ§Œμ•½ λ₯˜μž¬λͺ…이 μžˆμ„ 수 μžˆλŠ” μœ„μΉ˜μ˜ κ°œμˆ˜κ°€ λ¬΄ν•œλŒ€μΌ κ²½μš°μ—λŠ” -1을 좜λ ₯ν•œλ‹€.

[예제 μž…λ ₯ 1]

3
0 0 13 40 0 37
0 0 3 0 7 4
1 1 1 1 1 5

[예제 좜λ ₯ 1]

2
1
0

2. 풀이

[μž…λ ₯κ°’μ˜ 이해]

μ‘°κ·œν˜„κ³Ό λ°±μŠΉν™˜μ˜ μœ„μΉ˜λŠ” μ›μ˜ 쀑심을 λ‚˜νƒ€λ‚΄κ³ , κ°κ°μ—μ„œλΆ€ν„° λ₯˜μž¬λͺ…κΉŒμ§€μ˜ κ±°λ¦¬λŠ” μ›μ˜ λ°˜μ§€λ¦„μ„ λ‚˜νƒ€λ‚Έλ‹€.

∴ $x$, $y$λŠ” μ›μ˜ μ€‘μ‹¬μ’Œν‘œ, $r$은 λ°˜μ§€λ¦„μ— λŒ€ν•œ 정보λ₯Ό λ‚˜νƒ€λ‚Έλ‹€.

$x_1$, $y_1$, $r_1$은 첫번째 원에 λŒ€ν•œ 정보이고, $x_2$, $y_2$, $r_2$은 λ‘λ²ˆμ§Έ 원에 λŒ€ν•œ 정보이닀.

 

[좜λ ₯κ°’μ˜ 이해]

λ₯˜μž¬λͺ…이 μžˆμ„ 수 μžˆλŠ” μœ„μΉ˜λŠ” κ²°κ΅­, μ‘°κ·œν™˜κ³Ό λ°±μŠΉν™˜μ˜ μœ„μΉ˜λ₯Ό μ€‘μ‹¬μœΌλ‘œ ν•˜λŠ” 두 μ›μ˜ ꡐ점에 ν•΄λ‹Ήν•œλ‹€.

∴ 두 μ›μ˜ μœ„μΉ˜κ΄€κ³„λ₯Ό 톡해 ꡐ점의 개수λ₯Ό νŒŒμ•…ν•  수 있고, μ΄λŠ” λ₯˜μž¬λͺ…이 μžˆμ„ 수 μžˆλŠ” μœ„μΉ˜μ˜ κ°œμˆ˜μ— ν•΄λ‹Ήν•œλ‹€.

 

[두 μ›μ˜ μœ„μΉ˜κ΄€κ³„μ— λŒ€ν•œ 이해]

두 원을 각각 $O$, $O'$라 ν•˜κ³ , $O$의 λ°˜μ§€λ¦„μ„ $r$, $O'$의 λ°˜μ§€λ¦„μ„ $r'$, 두 μ›μ˜ 쀑심 μ‚¬μ΄μ˜ 거리λ₯Ό $d$라 ν•˜μž.

μ΄λ•Œ, 두 원이 μΌμΉ˜ν•˜λŠ” κ²½μš°μ—λ§Œ ꡐ점의 μˆ˜κ°€ λ¬΄ν•œλŒ€κ°€ λœλ‹€λŠ” 점을 μœ μ˜ν•˜λ„λ‘ ν•˜μž.

 

μœ„μΉ˜κ΄€κ³„ ꡐ점수
[λ°˜ν™˜κ°’]
μˆ˜μ‹ κ·Έλ¦Ό
1-1. 두 원이 μΌμΉ˜ν•œλ‹€. λ¬΄ν•œλŒ€[-1] - -
2-1. λ§Œλ‚˜μ§€ μ•ŠλŠ”λ‹€_μ™ΈλΆ€ 0[0] $r+r'<d$
2-2. ν•œ μ μ—μ„œ λ§Œλ‚œλ‹€_μ™Έμ ‘ 1[1] $r+r'=d$
2-3. 두 μ μ—μ„œ λ§Œλ‚œλ‹€ 2[2] $|r-r'|<d<r+r'$
2-4. ν•œ μ μ—μ„œ λ§Œλ‚œλ‹€_λ‚΄μ ‘ 1[1] $d<|r'-r|$
2-5. λ§Œλ‚˜μ§€ μ•ŠλŠ”λ‹€_λ‚΄λΆ€ 0[0] $d<|r'-r|$
2-6. λ§Œλ‚˜μ§€ μ•ŠλŠ”λ‹€_동심원 0[0] $d=0$

μœ„μ—μ„œ μ–ΈκΈ‰ν•œ λ‚΄μš©λ“€μ„ 가지고 μ½”λ“œλ₯Ό κ΅¬μ„±ν•˜λ©΄ μ•„λž˜μ™€ κ°™λ‹€.

3. μ½”λ“œ

#pragma warning(disable:4996) //visual studio scanf 였λ₯˜ 방지.
#include <stdio.h>
#include <stdlib.h> //abs() ν•¨μˆ˜ μ‚¬μš© λͺ©μ .
#include <math.h> //μˆ˜ν•™ν•¨μˆ˜ μ‚¬μš© λͺ©μ .

/* 원 ꡬ쑰체 μ„ μ–Έ */
typedef struct {
	int x;//xμ’Œν‘œ
	int y;//yμ’Œν‘œ
	int r;//λ°˜μ§€λ¦„
}Circle;

/* 두 μ›μ˜ 쀑심 사이 거리 κ΅¬ν•˜λŠ” ν•¨μˆ˜ */
double center_distance(Circle c1, Circle c2) {
	return sqrt(pow(c1.x - c2.x, 2) + pow(c1.y - c2.y, 2));
}

/* 두 μ›μ˜ μœ„μΉ˜κ΄€κ³„ κ΅¬ν•˜λŠ” ν•¨μˆ˜ */
int positional_relationship(Circle c1, Circle c2) {

	double d = center_distance(c1, c2);//μžλ£Œν˜•μ΄ doubleμž„μ— 주의.

	/* 1. 두 원이 μΌμΉ˜ν•  λ•Œ */
	if (c1.x == c2.x && c1.y == c2.y && c1.r == c2.r) {
		return -1;
	}
	/* 2. 두 원이 μΌμΉ˜ν•˜μ§€ μ•Šμ„ λ•Œ */
	else {
		/* 2-1. μ™ΈλΆ€ = ꡐ점 0개 */
		if (c1.r + c2.r < d)
			return 0;
		/* 2-2. μ™Έμ ‘ = ꡐ점 1개 */
		else if (c1.r + c2.r == d)
			return 1;
		/* 2-3. λ‘μ μ—μ„œ λ§Œλ‚¨ = ꡐ점 2개 */
		else if (abs(c1.r - c2.r) < d && d < c1.r + c2.r)
			return 2;
		/* 2-4. λ‚΄μ ‘ = ꡐ점 1개 */
		else if (abs(c1.r - c2.r) == d)
			return 1;
		/* 2-5. λ‚΄λΆ€ = ꡐ점 0개 */
		else if (d < abs(c1.r - c2.r))
			return 0;
		/* 2-6. 동심원 = ꡐ점 0개 */
		else if (d == 0)
			return 0;
	}
}

int main(int argc, char* argv[]) {
	int T;
	Circle c1, c2;

	scanf("%d", &T);
	for (int i = 0; i < T; i++) {
		scanf("%d %d %d %d %d %d", &c1.x, &c1.y, &c1.r, &c2.x, &c2.y, &c2.r);

		printf("%d\n", positional_relationship(c1, c2));
	}
	return 0;
}
728x90
λ°˜μ‘ν˜•