채원 :0
흐이이이이익
채원 :0
전체 방문자
오늘
어제
  • 모든 글 보기 (69)
    • 보지마세요 (65)
    • 알고리즘ㅋㅋㅋㅋㅋㅋ (1)
    • 다국어(?) 해보자고 (1)

블로그 메뉴

  • 관리
  • 글쓰기

공지사항

인기 글

태그

  • 파이썬
  • 가상환경

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
채원 :0

흐이이이이익

보지마세요

[구현] 백준 1004번 (C++)

2022. 6. 9. 16:44
 

1004번: 어린 왕자

입력의 첫 줄에는 테스트 케이스의 개수 T가 주어진다. 그 다음 줄부터 각각의 테스트케이스에 대해 첫째 줄에 출발점 (x1, y1)과 도착점 (x2, y2)이 주어진다. 두 번째 줄에는 행성계의 개수 n이 주

www.acmicpc.net

 

문제가 뭐야?

어린왕자가 출발점에서 도착점까지 가는데 행성을 최소 몇번 진입하고 탈출해야 하는지 구하는 문제

 

 

어떻게 풀꺼야?

출발점, 도착점 그리고 행성 사이의 관계를 생각해보면

  • 행성 안에 출발점, 도착점 둘 다 존재
  • 행성 안에 출발점, 도착점 둘 다 안 존재
  • 행성 안에 출발점만 존재
  • 행성 안에 도착점만 존재

근데 여기서 행성 안에 출발점, 도착점이 둘 다 존재하거나 or 둘 다 안 존재하면 해당 행성은 진입 및 탈출을 할 필요가 없다. 행성들 중 출발점이든 도착점이든 둘 중 1개만 존재하는 행성에서만 진입(탈출)하면 된다.

 

 

풀어보자

main함수에서 입력을 받고 모든 테스트 케이스에 대한 답을 출력한다

int main() {
    	//TESTCASES ANSWER
	vector<int> answer;

	//INPUT - TESTCASE
	int tc;
	cin >> tc;

	for(int i=0; i<tc; i++) {

		pair<int,int> start, end;
		vector<Circle> circles;

        	// INPUT - START POINT, END POINT
		int x1,y1,x2,y2;
		cin >> x1 >> y1 >> x2 >> y2;
		start = make_pair(x1,y1);
		end = make_pair(x2,y2);

		// INPUT - PLANET COUNT
		int cn;
		cin >> cn;

		// INPUT - PLANET
		for(int j=0; j<cn; j++) {
			int x,y,r;
			cin >> x >> y >> r;

			Circle c;
			c.setCircle(x,y,r);

			circles.push_back(c);
		}

		// TESTCASE'S SOLVE
		int ans = solve(circles,start,end,cn);
		answer.push_back(ans);
	}

	// OUTPUT - TESTCASES ANSWER
	for(int ans:answer) cout << ans << endl;
	return 0;
}

 

solve함수에서 각 테스트 케이스의 최소 진입 및 탈출 횟수를 계산한다

// FIND PLANET WHICH HAS ONLY ONE POINT
int solve(vector<Circle> &circles, pair<int,int> start, pair<int,int> end, int cn) {
	//PLANETS, START POINT, END POINT, PLANET COUNT

	int answer = 0;

	for(int i=0; i<cn; i++) {
		//START POINT IN CHECK
		if(distance(circles[i].x,circles[i].y,start.first,start.second) <= circles[i].r) {
			circles[i].in_point++;
		}
		//END POINT IN CHECK
		if(distance(circles[i].x,circles[i].y,end.first,end.second) <= circles[i].r) {
			circles[i].in_point++;
		}
	}

    	// UPDATE ENTER(ESCAPE) COUNT
	for(int i=0; i<cn; i++){
		if(circles[i].in_point == 1) answer++;
	}

	return answer;
}

 

행성안에 출발점(도착점)이 존재하는지 확인하기 위해 행성의 중심점과 출발점(도착점) 사이의 거리를 구해서 행성의 반지름과 비교했다

// GET DISTANCE BETWEEN POINT1 AND POINT2
float distance(int px1, int py1, int px2, int py2) {
	return sqrt(pow(px1-px2,2)+pow(py1-py2,2));
}

 

각 행성을 (중심 좌표, 반지름, 내부에 점이 몇 개 있는지) 클래스로 표현했다

// PLANET CLASS
class Circle {
	public:
		int x;
		int y;
		int r;
		int in_point;

		void setCircle(int _x,int _y, int _r) {
			x = _x;
			y = _y;
			r = _r;
			in_point = 0;
		}
};

 

 

'보지마세요' 카테고리의 다른 글

React의 생명주기  (0) 2022.06.11
[구현] 백준 1388번 (C++)  (0) 2022.06.09
create-react-app 없이 React App 생성하기  (0) 2022.06.04
React Document 2 : Element, Component  (0) 2022.06.03
React Document 1 : React란?  (0) 2022.06.02
-

    티스토리툴바