= L (정렬되어 있으므로) printf("%lld\n", R - L + 1); } } "> = L (정렬되어 있으므로) printf("%lld\n", R - L + 1); } } "> = L (정렬되어 있으므로) printf("%lld\n", R - L + 1); } } ">

<aside> 1️⃣

문제: 1183번 약속

마법사 N 명이 각 한 명의 머글을 만날 예정

마법사의 약속 시간은 A1, A2, ..., AN이고, 도착 시간은 B1, B2, ..., BN이다. 약속 시간을 T만큼 미루면, 기다리는 시간의 합은 |Ai + T - Bi|의 합과 같다. 기다리는 시간의 합이 최소가 되는 서로 다른 정수 T의 개수를 구해보자.

</aside>

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

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

int main(){
  //총 대기시간의 최소는 절대값 합의 최소를 구하는 것
    int N;
    if (scanf("%d", &N) != 1) return 0;
    long long P[55]; //P[i] = B_i - A_i 차이값
    for (int i = 0; i < N; i++){
        long long A, B;
        scanf("%lld %lld", &A, &B);
        P[i] = B - A;
    }

    qsort(P, N, sizeof(long long), compare);

    if (N % 2 == 1) {
        //홀수이면 유일한 중위값 하나
        printf("1\\n");
    } else {
        //짝수이면 중간 두 값 사이의 정수 개수
        long long L = P[N/2 - 1];
        long long R = P[N/2];
        //R >= L (정렬되어 있으므로)
        printf("%lld\\n", R - L + 1);
    }
}

image.png

<aside> 2️⃣

문제: 1406번 에디터

소문자만을 기록하는 편집기

커서

지원하는 명령어

L 커서를 왼쪽으로 한 칸 옮김 (커서가 문장의 맨 앞이면 무시됨)
D 커서를 오른쪽으로 한 칸 옮김 (커서가 문장의 맨 뒤이면 무시됨)
B 커서 왼쪽에 있는 문자를 삭제함 (커서가 문장의 맨 앞이면 무시됨)삭제로 인해 커서는 한 칸 왼쪽으로 이동한 것처럼 나타나지만, 실제로 커서의 오른쪽에 있던 문자는 그대로임
P $ $라는 문자를 커서 왼쪽에 추가함
</aside>
#include <stdio.h>
#include <string.h>

#define MAX 600000

char left[MAX], right[MAX];   //커서 왼쪽, 오른쪽 스택
int l_top = 0, r_top = 0;     //각 스택의 top 인덱스

int main() {
    char init[MAX+1];
    int M;
    scanf("%s", init);
    scanf("%d", &M);

    //초기 문자열을 left 스택에 넣음
    l_top = strlen(init);
    for (int i = 0; i < l_top; i++) {
        left[i] = init[i];
    }

    for (int i = 0; i < M; i++) {
        char cmd;
        scanf(" %c", &cmd);

        if (cmd == 'L') {  //커서를 왼쪽으로
            if (l_top > 0) {
                right[r_top++] = left[--l_top];
            }
        }
        else if (cmd == 'D') {  //커서를 오른쪽으로
            if (r_top > 0) {
                left[l_top++] = right[--r_top];
            }
        }
        else if (cmd == 'B') {  //왼쪽 문자 삭제
            if (l_top > 0) {
                l_top--;
            }
        }
        else if (cmd == 'P') {  //문자 추가
            char x;
            scanf(" %c", &x);
            left[l_top++] = x;
        }
    }

    //최종 결과 출력: left + (right를 거꾸로)
    for (int i = 0; i < l_top; i++) {
        putchar(left[i]);
    }
    for (int i = r_top - 1; i >= 0; i--) {
        putchar(right[i]);
    }
    return 0;
}

image.png