1. 알고리즘 문제

  1. 29730번 임스의 데일리 인증 스터디
// 이예고운
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int compare(const void* a, const void* b) {
    char* str1 = *(char**)a;
    char* str2 = *(char**)b;
    int len1 = strlen(str1);
    int len2 = strlen(str2);

    if (len1 != len2) {
        return len1 - len2;
    }

    return strcmp(str1, str2);
}

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

    char** record = (char**)malloc(sizeof(char*) * n);
    char** boj = (char**)malloc(sizeof(char*) * n);

    int boj_count = 0;
    int other_count = 0;

    for (int i = 0; i < n; i++) {
        record[i] = (char*)malloc(sizeof(char) * 101);
        scanf("%[^\\n]%*c", record[i]);

        if (strncmp(record[i], "boj.kr", 6) == 0) {
            boj[boj_count] = record[i]; // boj.kr로 시작하는 문자열
            boj_count++;
        }
        else {
            record[other_count] = record[i]; // 그 외 문자열
            other_count++;
        }
    }

    qsort(record, other_count, sizeof(char*), compare); // "boj.kr"로 시작하지 않는 문자열 정렬

    qsort(boj, boj_count, sizeof(char*), compare); // "boj.kr"로 시작하는 문자열 정렬

    for (int i = 0; i < other_count; i++) { // "boj.kr"로 시작하지 않는 문자열 출력
        printf("%s\\n", record[i]);
    }

    for (int i = 0; i < boj_count; i++) { // "boj.kr"로 시작하는 문자열 출력
        printf("%s\\n", boj[i]);
    }

    for (int i = 0; i < other_count; i++) {
        free(record[i]);
    }
    for (int i = 0; i < boj_count; i++) {
        free(boj[i]);
    }
    free(record);
    free(boj);

    return 0;
}

// 정재훈
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int is_boj_link(const char *str) {
    return strncmp(str, "boj.kr/", 7) == 0;
}

int get_problem_number(const char *str) {
    return atoi(str + 7);
}

int compare_study(const void *a, const void *b) {
    const char *str1 = *(const char **)a;
    const char *str2 = *(const char **)b;
    int len1 = strlen(str1);
    int len2 = strlen(str2);
    
    if (len1 != len2) {
        return len1 - len2;
    }
    return strcmp(str1, str2);
}

int compare_boj(const void *a, const void *b) {
    int num1 = get_problem_number(*(const char **)a);
    int num2 = get_problem_number(*(const char **)b);
    return num1 - num2;
}

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

    char *records[1000];
    char buffer[101];
    int study_count = 0;
    int boj_count = 0;
    
    for (int i = 0; i < N; i++) {
        scanf("%[^\\n]", buffer);
        getchar(); 
        records[i] = strdup(buffer);
    }
    
    char *studies[1000];
    char *bojs[1000];
    
    for (int i = 0; i < N; i++) {
        if (is_boj_link(records[i])) {
            bojs[boj_count++] = records[i];
        } else {
            studies[study_count++] = records[i];
        }
    }
    
    qsort(studies, study_count, sizeof(char *), compare_study);
    qsort(bojs, boj_count, sizeof(char *), compare_boj);
    
    for (int i = 0; i < study_count; i++) {
        printf("%s\\n", studies[i]);
        free(studies[i]);
    }
    for (int i = 0; i < boj_count; i++) {
        printf("%s\\n", bojs[i]);
        free(bojs[i]);
    }
}

  1. 1064번 평행사변형
// 이예고운
#include <stdio.h>
#include <math.h>

double length(double ax, double ay, double bx, double by) {
    double x = ax - bx;
    double y = ay - by;
    return sqrt(x * x + y * y);
}

int main() {
    double ax, ay, bx, by, cx, cy;
    scanf("%lf %lf %lf %lf %lf %lf", &ax, &ay, &bx, &by, &cx, &cy);

    if ((ay - by) * (bx - cx) == (by - cy) * (ax - bx)) {
        printf("-1.0\\n");
        return 0;
    }

    double ab_length = length(ax, ay, bx, by);
    double bc_length = length(bx, by, cx, cy);
    double ac_length = length(ax, ay, cx, cy);

    double perimeter_1 = 2 * (ab_length + bc_length);
    double perimeter_2 = 2 * (bc_length + ac_length);
    double perimeter_3 = 2 * (ab_length + ac_length);

    double max_perimeter = fmax(fmax(perimeter_1, perimeter_2), perimeter_3);
    double min_perimeter = fmin(fmin(perimeter_1, perimeter_2), perimeter_3);

    printf("%.16lf\\n", max_perimeter - min_perimeter);

    return 0;
}

// 정재훈
#include <stdio.h>
#include <math.h>

double getLength(double x1, double y1, double x2, double y2) {
    return sqrt(pow(x1 - x2, 2) + pow(y1 - y2, 2));
}

int main() {
    int points[6];

    for (int i = 0; i < 6; i++) {
        scanf("%d", &points[i]);
    }

    if ((points[2] - points[0]) * (points[5] - points[1]) == (points[4] - points[0]) * (points[3] - points[1])) {
        printf("-1\\n");
        return 0;
    }

    double ab = getLength(points[0], points[1], points[2], points[3]);
    double bc = getLength(points[2], points[3], points[4], points[5]);
    double ca = getLength(points[4], points[5], points[0], points[1]);

    double max = fmax(ab, fmax(bc, ca));
    double min = fmin(ab, fmin(bc, ca));

    printf("%.9lf\\n", 2 * (max - min));

    return 0;
}

2. 조합론

모각소_확통+조합론.pptx