<aside> 1️⃣
문제: 1004번 어린 왕자
출발점에서 도착점까지 갈 때 원을 최대한 적게 통과하고 가도록 할 때 몇 개의 원을 지나고 가는지 구하는 문제
위 예시의 경우 최소 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);
}
}
<aside> 2️⃣
문제: 2193번 이친수
N자리 이진수 중 아래 성질을 가진 ‘이친수’가 몇 개인지 구하기
#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]);
}