※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 1183번 문제인 약속이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/1183
1183번: 약속
첫째 줄에 오민식 그룹의 사람 수 N이 주어진다. N은 10,000보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 각각의 오민식 그룹 사람의 원래 약속시간과 도착시간이 주어진다. 이 값은 10^9
www.acmicpc.net
문제의 조건에서, "오민식 그룹이 N명이고, 오민식 그룹의 원래 약속시간이 배열 S라고 하고, 도착하는 시간을 배열A이라고 하고, 약속을 T시간만큼 미뤘다면, 기다리는 시간의 총합은 abs(S[i]+T-A[i])를 모두 더한 값이 된다."라고 한 부분을 주목하자.
S[i] - T[i]는 변하는 값이 아니므로 상수 "-C[i]"로 생각하자. 그러면, 기다리는 시간의 총합은 abs(T-C[i])가 된다.
T가 1 늘어나면 총합은 T>C[i]인 개수만큼 시간의 총합이 늘어나고, T<C[i]인 개수만큼 시간의 총합이 줄어든다.
마찬가지로, T가 1 감소하면 T>C[i]인 개수만큼 시간의 총합이 감소하고, T<C[i]인 개수만큼 시간의 총합이 늘어난다.
위 내용을 잘 생각하면, N이 홀수일 경우 T가 정렬된 C값들 중 중앙값인 경우 하나, 짝수일 경우 정렬된 C값들 중 가운데 두 값 사이(경계값 포함)의 수의 개수가 답이 될 것임을 알 수 있다.
아래는 제출한 소스코드이다.
#include <iostream>
#include <algorithm>
typedef long long ll;
using namespace std;
int arr[10000];
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int N; cin >> N;
for (int i = 0; i < N; i++) {
int x, y; cin >> x >> y;
arr[i] = x - y;
}
sort(arr, arr + N);
if (N & 1) cout << 1;
else cout << arr[N / 2] - arr[N / 2 - 1] + 1;
}
'BOJ' 카테고리의 다른 글
[BOJ 11563 // C++] 연돌이와 고잠녀 (0) | 2021.05.14 |
---|---|
[BOJ 11562 // C++] 백양로 브레이크 (0) | 2021.05.13 |
[BOJ 11561 // C++] 징검다리 (0) | 2021.05.11 |
[BOJ 11560 // C++] 다항식 게임 (0) | 2021.05.10 |
[BOJ 11559 // C++] Puyo Puyo (0) | 2021.05.09 |