max_count) { max_count = count; majority = soldiers[i - 1]; } co"> max_count) { max_count = count; majority = soldiers[i - 1]; } co"> max_count) { max_count = count; majority = soldiers[i - 1]; } co">

<aside> 1️⃣

1270번 전쟁 - 땅따먹기

번호의 군대가 있을 때 한 군대의 병사가 절반을 초과하면 지배하게 됨.

각 땅들을 지배한 군대의 번호 출력하기

</aside>

#include <stdio.h>
#include <stdlib.h>

int compare(const void *a, const void *b) {
    long long x = *(long long*)a;
    long long y = *(long long*)b;
    if (x > y) return 1;
    else if (x < y) return -1;
    else return 0;
}

//군대의 병사가 절반을 초과한다면 그 땅은 그 번호의 군대의 지배하에
int main() {
    int n; //땅 개수
    scanf("%d", &n);

    while (n--) {
        int T; //각 땅마다 병사 번호
        scanf("%d", &T);

        long long soldiers[100000];
        for (int i = 0; i < T; i++) {
            scanf("%lld", &soldiers[i]);
        }

        //정렬 후 가장 긴 연속된 구간 찾기
        qsort(soldiers, T, sizeof(long long), compare);

        int max_count = 1;
        int count = 1;
        long long majority = soldiers[0];

        for (int i = 1; i < T; i++) {
            if (soldiers[i] == soldiers[i - 1]) {
                count++;
            } else {
                if (count > max_count) {
                    max_count = count;
                    majority = soldiers[i - 1];
                }
                count = 1;
            }
        }

        //마지막 구간 처리
        if (count > max_count) {
            max_count = count;
            majority = soldiers[T - 1];
        }

        if (max_count > T / 2)
            printf("%lld\\n", majority);
        else
            printf("SYJKGW\\n");
    }

    return 0;
}

채점이 엄청 오래걸렸다..

채점이 엄청 오래걸렸다..

<aside> 2️⃣

1459번 걷기

학교에서 집으로 갈 때 도시의 세로 도로는 모든 정수 x좌표마다 있고, 가로 도로는 모든 정수 y좌표마다 있음

(0, 0)에서 출발해 가로나 세소소 한 블록씩 움직일 때 집으로 가는 최소시간 구하기

</aside>

#include <stdio.h>

#define ll long long

int main() {
    ll X, Y, W, S;
    scanf("%lld %lld %lld %lld", &X, &Y, &W, &S);

    //X, Y 중 작은 쪽만큼은 대각선으로 갈 수 있음
    ll minXY = (X < Y) ? X : Y;
    ll maxXY = (X > Y) ? X : Y;

    ll result = 0;

    if (S >= 2 * W) {
        //대각선이 비효율적 -> 전부 직선으로 이동
        result = (X + Y) * W;
    } 
    else if (S >= W) {
        //대각선이 한 번의 직선보다 싸거나 같고, 두 번보단 비싸지 않음
        result = minXY * S + (maxXY - minXY) * W;
    } 
    else {
        //대각선이 가장 효율적일 때
        ll diff = maxXY - minXY;
        //짝수면 전부 대각선으로 이동 가능, 홀수면 마지막 한 칸 직선
        if (diff % 2 == 0)
            result = maxXY * S;
        else
            result = (maxXY - 1) * S + W;
    }

    printf("%lld\\n", result);
    return 0;
}

image.png