<aside> 1️⃣

문제: 1004번 어린 왕자

출발점에서 도착점까지 갈 때 원을 최대한 적게 통과하고 가도록 할 때 몇 개의 원을 지나고 가는지 구하는 문제

위 예시의 경우 최소 3개의 원을 통과

위 예시의 경우 최소 3개의 원을 통과

</aside>

	#include <stdio.h> 
	#include <math.h>
	
	int inside(int x, int y, int cx, int cy, int r){
		//출발점과 도착점이 원 내부에 있는지 계산하는 함수
		int dx = cx - x;
		int dy = cy - y;
		return dx * dx + dy * dy < r * r; //피타고라스식으로 확인
	}
	
	int main(){
		int T;
		scanf("%d", &T);
		while(T--){
			int x1, x2, y1, y2, n;
			int count = 0;
			scanf("%d %d %d %d", &x1, &y1, &x2, &y2); //출발점과 도착점
			scanf("%d", &n); //행성의 개수
			
			for(int i = 0; i < n; i++){
				int cx, cy, r; //원의 중점과 반지름
				scanf("%d %d %d", &cx, &cy, &r);
				
				//출발점 혹은 도착점이 해당 원 내에 있는 경우에만 통과해서 감
				int start = inside(x1, y1, cx, cy, r);
				int end = inside(x2, y2, cx, cy, r);
				//만일 출발점과 도착점이 모두 같은 원 내에 있으면 통과하지 않음
				if(start != end)
					count++;
			}
			printf("%d\\n", count);		
		}
	}

image.png

<aside> 2️⃣

문제: 2193번 이친수

N자리 이진수 중 아래 성질을 가진 ‘이친수’가 몇 개인지 구하기

  1. 0으로 시작하지 않음
  2. 1이 두 번 연속으로 나타나지 않음
#include <stdio.h>

int main(){
	int N;
	scanf("%d", &N);
	
	long long arr[N+1][2]; //자리수,  마지막 자리가 0이거나 1
	
	arr[1][0] = 0; //한자리인 경우 0으로 시작할 수 없음
	arr[1][1] = 1; //한자리인 경우 '1' 1개
	
	for(int i = 2; i <= N; i++){
		//마지막 자리가 0이면 그 앞에 0과 1이 올 수 있음(개수 합하기) 
		arr[i][0] = arr[i-1][0] + arr[i-1][1]; //(점화식)
		//마지막이 1이면 그 앞은 0만 가능 (그 개수만 셈)
		arr[i][1] = arr[i-1][0];
	}
	printf("%lld", arr[N][0] + arr[N][1]);
}

image.png