자료구조와 알고리즘/문제풀이

[Baekjoon] 단계별로 풀어보기 : 기하 직사각형과 삼각형

순정법사 2023.08.25

 

이번 알고리즘 문제 풀이는 C로 진행했습니다 

코드에 오탈자나 문제가 있으면 언제든지 댓글로 알려주세요!

 

 


 

 

 

A. 기하 직사각형과 삼각형

 

기하: 직사각형과 삼각형 단계

기하: 직사각형과 삼각형

www.acmicpc.net

 

1. 직사각형

a. 문제지  : 27323

 

b. 정답

A*B 넓이를 구하면 되는 쉬운 문제!

 

📚 풀이

#include <stdio.h>

int main(){
    int A, B;
    scanf("%d %d", &A, &B);
    
    printf("%d", A*B);
}

 

 

2. 직사각형에서 탈출

a. 문제지  : 1085

 

b. 알고리즘 / 풀이

경계선까지 가는 방법은 위 그림과 같이 4가지 방법이 있음

X는 0이나 W, Y는 0이나 H

따라서 4개의 값을 비교하면 끝!

 

c. 정답

📚 풀이

#include <stdio.h>

int min(int a, int b) {
    return a < b ? a : b;
}

int main() {
    int x, y, w, h;
    scanf("%d %d %d %d", &x, &y, &w, &h);

    // 위, 아래, 왼쪽, 오른쪽으로 가는 거리 중에서 최솟값 찾기
    int min_distance = min(min(x, w - x), min(y, h - y));

    // 결과 출력
    printf("%d\n", min_distance);

    return 0;
}

 

 

3. 네 번째 점

a. 문제지  : 3009

 

b. 알고리즘 / 풀이

네 번째 점은 위와같이 주어진 세 점의 중복되지 않는 좌표 값들을 찾아서 구하면 됨

 

1) 삼항 연산자 사용

 

x값과 y값을 배열로 선언

반복문으로 입력받음

삼항 연산자를 이용해 배열 값을 비교해 중복되지 않는 값을 추출

네 번째 점의 좌표 출력

 

2) XOR 연산자 사용

 

베타적 논리합 연산자를 사용하면 세개의 값을 비교할 때 편리함

 

🤓 예제 1 : 5 ^ 5 ^ 7 연산의 도식화

5 : 0101
5 : 0101
---------
    0000
7 : 0111
---------
7 : 0111

 

🤓 예제 2 : 7 ^ 4 ^ 7 연산의 도식화

7 : 0111
4 : 0100
---------
    0011
7 : 0111
---------
7 : 0100

 

위와같이 XOR 연산은 같은 비트 위치에 있는 두 값이 다를 때 1을 반환하고, 같을 때 0을 반환

이를 이용해 주어진 세 점 중에서 두 번 출현하는 x 좌표와 y 좌표를 쉽게 찾을 수 있음

 

c. 정답

📚 풀이 1 : 삼항연산을 이용

#include <stdio.h>

int main() {
    int x[3], y[3];

    // 세 점의 좌표 입력 받기
    for (int i = 0; i < 3; ++i) {
        scanf("%d %d", &x[i], &y[i]);
    }

    int x4, y4; // 네 번째 점의 좌표

    // 각 좌표 값 중에서 두 번 출현하는 좌표 찾기
    x4 = (x[0] == x[1]) ? x[2] : (x[0] == x[2]) ? x[1] : x[0];
    y4 = (y[0] == y[1]) ? y[2] : (y[0] == y[2]) ? y[1] : y[0];

    // 네 번째 점의 좌표 출력
    printf("%d %d\n", x4, y4);

    return 0;
}

 

📚 풀이 2 : XOR 연산을 이용

#include <stdio.h>

int main() {
    int x[3], y[3];

    // 세 점의 좌표 입력 받기
    for (int i = 0; i < 3; ++i) {
        scanf("%d %d", &x[i], &y[i]);
    }

    // 네 번째 점의 좌표 계산 및 출력
    printf("%d %d\n", x[0] ^ x[1] ^ x[2], y[0] ^ y[1] ^ y[2]);

    return 0;
}

 

 

4. 수학은 체육과목 입니다

a. 문제지  : 15894

 

b. 알고리즘 / 풀이

 

정사각형의 개수가 10^9까지니까 int보다 long long을 사용해서 풀이해야 한다

 

🧡 long 을 사용하지 않는 이유

long 자료형은 int보다 더 넓은 범위의 정수 값을 표현할 수 있는 자료형
그러나 long의 크기는 컴파일러와 플랫폼에 따라 다를 수 있고 보통 4바이트(32비트) 또는 8바이트(64비트)로 구현

그래서 long을 사용하더라도 32비트 컴파일러에서는 int와 같은 크기

이와 달리 long long은 표준에서 최소한 64비트를 보장해 크기가 더 큰 범위의 값을 저장할 수 있음
따라서 매우 큰 정수 값을 다룰 때에는 long long을 사용하는 것이 안전함

 

c. 정답

📚 풀이

#include <stdio.h>

int main() {
    long long n;
    scanf("%lld", &n);

    // 계산식을 이용하여 둘레의 길이를 구함
    long long perimeter = 4 * n;

    printf("%lld\n", perimeter);

    return 0;
}

 

 

5. 대지

a. 문제지  : 9063

 

b. 알고리즘 / 풀이

  1. N 입력받기
  2. 각 X, Y값의 최소값, 최대값을 미리 지정해둠
  3. N번 반복문으로 X,Y값을 입력받고 조건문으로 값이 최대값인지 최소값인지 판별
  4. 가로 세로 길이를 구하고 넓이를 출력

 

c. 정답

📚 풀이

#include <stdio.h>

int main() {
    int N;
    scanf("%d", &N);

    int minX = 10001, minY = 10001;
    int maxX = -10001, maxY = -10001;

    for (int i = 0; i < N; i++) {
        int x, y;
        scanf("%d %d", &x, &y);
        
        // 점의 좌표를 이용하여 최소/최대 x, y 좌표 갱신
        if (x < minX) minX = x;
        if (x > maxX) maxX = x;
        if (y < minY) minY = y;
        if (y > maxY) maxY = y;
    }

    // 직사각형의 넓이 계산
    long long width = (long long)(maxX - minX);
    long long height = (long long)(maxY - minY);

    printf("%lld\n", width * height);

    return 0;
}

 

 

6. 삼각형 외우기

a. 문제지  : 10101

 

b. 정답

📚 풀이

#include <stdio.h>

int main() {
    int A, B, C;
    scanf("%d %d %d", &A, &B, &C); // 세 각의 크기 입력

    // 세 각의 합이 180인지 확인
    if (A + B + C == 180) {
        // 세 각이 모두 60이면 Equilateral 삼각형
        if (A == 60 && B == 60 && C == 60) {
            printf("Equilateral");
        }
        // 두 각이 같으면 Isosceles 삼각형
        else if ((A == B) || (A == C) || (B == C)) {
            printf("Isosceles");
        }
        // 모든 각이 다르면 Scalene 삼각형
        else {
            printf("Scalene");
        }
    } 
    // 세 각의 합이 180이 아니면 Error
    else {
        printf("Error");
    }

    return 0;
}

 

 

7. 삼각형과 세 변

a. 문제지  : 5073

 

b. 정답

📚 풀이

#include <stdio.h>

int main() {
    while (1) {
        int A, B, C;
        scanf("%d %d %d", &A, &B, &C); // 세 변의 길이 입력

        int sum = A + B + C; // 세 변의 길이 합을 계산
        if (sum == 0) { // 모든 변의 길이가 0이면 반복 종료
            break;
        }

        int lon = A > B ? (A > C ? A : C) : (B > C ? B : C); // 가장 긴 변의 길이 계산

        if (A == B && B == C) { // 세 변의 길이가 모두 같으면 Equilateral 출력
            printf("Equilateral\n");
        } else if (sum - lon * 2 <= 0) { // 가장 긴 변의 길이보다 나머지 두 변의 길이의 합이 길지 않으면 Invalid 출력
            printf("Invalid\n");
        } else if ((A == B) || (C == B) || (A == C)) { // 두 변의 길이가 같으면 Isosceles 출력
            printf("Isosceles\n");
        } else { // 위 경우에 해당하지 않으면 Scalene 출력
            printf("Scalene\n");
        }
    }

    return 0;
}

 

 

8. 세 막대

a. 문제지  : 14215

 

b. 알고리즘 / 풀이

위 7번 삼각형과 세 변에서 푼 방식을 활용해서 풀이

 

c. 정답

📚 풀이

#include <stdio.h>

int main() {
    int A, B, C;
    scanf("%d %d %d", &A, &B, &C); // 세 변의 길이 입력
    
    int sum = A + B + C; // 세 변의 길이 합
    int lon = A > B ? (A > C ? A : C) : (B > C ? B : C); // 가장 긴 변의 길이

    if(A==B && B==C){
    }else if (sum - lon * 2 <= 0){
        // 가장 긴 변의 길이가 나머지 두 변의 길이 합보다 크거나 같은 경우
        // 이 경우 세 변으로 삼각형을 만들 수 없으므로, 세 변의 길이 합에서 (가장 긴 변의 길이 * 2)를 빼줌
        // 이렇게 해서 나온 값이 삼각형의 둘레가 됨
        int i=0;
        while(sum-lon*2<1-i){
            i++;
        }
       sum -= i;
    }else{
    }
    
    printf("%d", sum);

    return 0;
}