728x90
반응형

어린 왕자 

 

문제

어린 왕자는 소혹성 B-664에서 자신이 사랑하는 한 송이 장미를 위해 살아간다. 어느 날 장미가 위험에 빠지게 된 것을 알게 된 어린 왕자는, 장미를 구하기 위해 은하수를 따라 긴 여행을 하기 시작했다. 하지만 어린 왕자의 우주선은 그렇게 좋지 않아서 행성계 간의 이동을 최대한 피해서 여행해야 한다. 아래의 그림은 어린 왕자가 펼쳐본 은하수 지도의 일부이다.

빨간 실선은 어린 왕자가 출발점에서 도착점까지 도달하는데 있어서 필요한 행성계 진입/이탈 횟수를 최소화하는 경로이며, 원은 행성계의 경계를 의미한다. 이러한 경로는 여러 개 존재할 수 있지만 적어도 3번의 행성계 진입/이탈이 필요하다는 것을 알 수 있다.

위와 같은 은하수 지도, 출발점, 도착점이 주어졌을 때 어린 왕자에게 필요한 최소의 행성계 진입/이탈 횟수를 구하는 프로그램을 작성해 보자. 행성계의 경계가 맞닿거나 서로 교차하는 경우는 없다. 또한, 출발점이나 도착점이 행성계 경계에 걸쳐진 경우 역시 입력으로 주어지지 않는다.

입력

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

출력

각 테스트 케이스에 대해 어린 왕자가 거쳐야 할 최소의 행성계 진입/이탈 횟수를 출력한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <stdio.h>
 
int dis(int x1, int y1, int x2, int y2){
    return (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);
}
 
 
 
int main()
{
    int T;
    scanf("%d",&T);
    int x1,y1,x2,y2;
    int n;
    int cnt = 0;
    for(int i=0; i<T; i++){
        scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
        scanf("%d",&n);
        int x,y,r;
        for(int j=0; j<n; j++){
            scanf("%d %d %d",&x,&y,&r);
            if(dis(x,y,x1,y1)<r*r&&dis(x,y,x2,y2)>r*r) cnt++;
            if(dis(x,y,x1,y1)>r*r&&dis(x,y,x2,y2)<r*r) cnt++;
        }
        printf("%d\n",cnt);
        cnt = 0;
    }
 
    return 0;
}
 
cs
반응형

'백준 단계별로 풀어보기 > 기하 1' 카테고리의 다른 글

백준 2477 참외밭  (0) 2022.10.12
백준 4153 직각삼각형  (0) 2022.10.10
백준 3009 네 번째 점  (0) 2022.10.10
백준 1085 직사각형에서 탈출  (0) 2022.10.10
728x90
반응형

참외밭

문제

시골에 있는 태양이의 삼촌 댁에는 커다란 참외밭이 있다. 문득 태양이는 이 밭에서 자라는 참외가 도대체 몇 개나 되는지 궁금해졌다. 어떻게 알아낼 수 있는지 골똘히 생각하다가 드디어 좋은 아이디어가 떠올랐다. 유레카! 1m2의 넓이에 자라는 참외 개수를 헤아린 다음, 참외밭의 넓이를 구하면 비례식을 이용하여 참외의 총개수를 구할 수 있다.

1m2의 넓이에 자라는 참외의 개수는 헤아렸고, 이제 참외밭의 넓이만 구하면 된다. 참외밭은 ㄱ-자 모양이거나 ㄱ-자를 90도, 180도, 270도 회전한 모양(┏, ┗, ┛ 모양)의 육각형이다. 다행히도 밭의 경계(육각형의 변)는 모두 동서 방향이거나 남북 방향이었다. 밭의 한 모퉁이에서 출발하여 밭의 둘레를 돌면서 밭경계 길이를 모두 측정하였다.

예를 들어 참외밭이 위 그림과 같은 모양이라고 하자. 그림에서 오른쪽은 동쪽, 왼쪽은 서쪽, 아래쪽은 남쪽, 위쪽은 북쪽이다. 이 그림의 왼쪽위 꼭짓점에서 출발하여, 반시계방향으로 남쪽으로 30m, 동쪽으로 60m, 남쪽으로 20m, 동쪽으로 100m, 북쪽으로 50m, 서쪽으로 160m 이동하면 다시 출발점으로 되돌아가게 된다.

위 그림의 참외밭  면적은 6800m2이다. 만약 1m2의 넓이에 자라는 참외의 개수가 7이라면, 이 밭에서 자라는 참외의 개수는 47600으로 계산된다.

1m2의 넓이에 자라는 참외의 개수와, 참외밭을 이루는 육각형의 임의의 한 꼭짓점에서 출발하여 반시계방향으로 둘레를 돌면서 지나는 변의 방향과 길이가 순서대로 주어진다. 이 참외밭에서 자라는 참외의 수를 구하는 프로그램을 작성하시오.

입력

첫 번째 줄에 1m2의 넓이에 자라는 참외의 개수를 나타내는 양의 정수 K (1 ≤ K ≤ 20)가 주어진다. 참외밭을 나타내는 육각형의 임의의 한 꼭짓점에서 출발하여 반시계방향으로 둘레를 돌면서 지나는 변의 방향과 길이 (1 이상 500 이하의 정수) 가 둘째 줄부터 일곱 번째 줄까지 한 줄에 하나씩 순서대로 주어진다. 변의 방향에서 동쪽은 1, 서쪽은 2, 남쪽은 3, 북쪽은 4로 나타낸다.

출력

첫째 줄에 입력으로 주어진 밭에서 자라는 참외의 수를 출력한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
 
#include <stdio.h>
 
int main()
{
    int N;
    scanf("%d",&N);
    int trash[6], length[6],big=0,small=0,k=0;
    for(int i=0;i<6; i++){
        scanf("%d %d",&trash[i],&length[i]);
    }
    for(int i=0; i<6; i++){
        if(big<length[i]*length[(i+1)%6]){
            big=length[i]*length[(i+1)%6];
            k=i;
        }
        
        
    }
    small=length[(k+3)%6]*length[(k+4)%6];
    big=big-small;
    printf("%d",big*N);
    return 0;
}
 
cs

처음엔 방향이 중요한 줄 알았다.

방향 배열을 만들어서 구현하려고 했지만 문제 조건에서는 필요 없어 보였다.

밭의 경계가 모두 x,y축에 평행한 6각형 모양이기 때문이다.

다음과 같은 모양일 수 밖에 없는데, 이런 ㄱ 자 모양에서는 '가로의 최대값 후 3번째 길이는 작은 직사각형의 세로 길이' 이다.

가장 긴 가로길이가 i 번째에 나왔으면, 작은 직사각형의 세로 길이는 (i+3)%6 번째에 나오게 된다.

 

그리고 작은 직사각형의 가로길이는 작은 직사각형의 세로 길이 바로 다음 나올 수 밖에 없다.

따라서 작은 직사각형의 가로길이는 (i+3+1)%6 번째에 나오게 된다.

 

결국 입력 받은 6개의 길이 중 가장 큰 가로 세로 값을 찾아 큰 직사각형의 넓이를 구한 후

위와 같이 작은 직사각형의 넓이를 빼주면 된다.

반응형

'백준 단계별로 풀어보기 > 기하 1' 카테고리의 다른 글

백준 1004 어린 왕자  (1) 2022.10.31
백준 4153 직각삼각형  (0) 2022.10.10
백준 3009 네 번째 점  (0) 2022.10.10
백준 1085 직사각형에서 탈출  (0) 2022.10.10
728x90
반응형

직각삼각형 

문제

과거 이집트인들은 각 변들의 길이가 3, 4, 5인 삼각형이 직각 삼각형인것을 알아냈다. 주어진 세변의 길이로 삼각형이 직각인지 아닌지 구분하시오.

입력

입력은 여러개의 테스트케이스로 주어지며 마지막줄에는 0 0 0이 입력된다. 각 테스트케이스는 모두 30,000보다 작은 양의 정수로 주어지며, 각 입력은 변의 길이를 의미한다.

출력

각 입력에 대해 직각 삼각형이 맞다면 "right", 아니라면 "wrong"을 출력한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
 
#include <stdio.h>
#include <math.h>
int main()
{
    int a,b,c;
    while(1){
        int max,l,m;
        
        scanf("%d %d %d",&a,&b,&c);
        if(a==0&&b==0&&c==0break;
        if(a>b&&a>c){
            max = a;
            l=b; m=c;
        } 
        else if(b>a&&b>c){
            max = b;
            l=a; m=c;
        } 
        else{
            max = c;
            l=a;m=b;
        } 
        
        if(pow(max,2)==pow(l,2)+pow(m,2)){
            printf("right\n");
        }else printf("wrong\n");
        
        
        
    }
    return 0;
}
 
cs

최대값은 빗변의 길이가 뭔지 확인하기 위해 찾았다.

 

반응형

'백준 단계별로 풀어보기 > 기하 1' 카테고리의 다른 글

백준 1004 어린 왕자  (1) 2022.10.31
백준 2477 참외밭  (0) 2022.10.12
백준 3009 네 번째 점  (0) 2022.10.10
백준 1085 직사각형에서 탈출  (0) 2022.10.10
728x90
반응형

네 번째 점 

 

문제

세 점이 주어졌을 때, 축에 평행한 직사각형을 만들기 위해서 필요한 네 번째 점을 찾는 프로그램을 작성하시오.

입력

세 점의 좌표가 한 줄에 하나씩 주어진다. 좌표는 1보다 크거나 같고, 1000보다 작거나 같은 정수이다.

출력

직사각형의 네 번째 점의 좌표를 출력한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 
#include <stdio.h>
 
int main()
{
    int x1,y1,x2,y2,x3,y3;
    scanf("%d %d %d %d %d %d",&x1,&y1,&x2,&y2,&x3,&y3);
    int x4,y4;
    if(x1==x2) x4=x3;
    else if(x1==x3) x4=x2;
    else x4=x1;
    
    if(y1==y2) y4=y3;
    else if(y1==y3) y4=y2;
    else y4=y1;
    
    
    
    printf("%d %d",x4,y4);
    return 0;
}
 
cs

 

축에 평행한 직사각형이고 4번째 점을 찾기만 하면 된다

축에 평행한 직사각형이면 x,y좌표가 총 2개씩 나올 것이다.

즉, 입력된 3개의 좌표 중 똑같지 않은 x,y값이 4번째 좌표의 x,y값일 것이다.

반응형

'백준 단계별로 풀어보기 > 기하 1' 카테고리의 다른 글

백준 1004 어린 왕자  (1) 2022.10.31
백준 2477 참외밭  (0) 2022.10.12
백준 4153 직각삼각형  (0) 2022.10.10
백준 1085 직사각형에서 탈출  (0) 2022.10.10

+ Recent posts