= 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);
}
}

<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;
}
