티스토리 뷰
728x90
반응형

https://jungol.co.kr/problem/3234
* 사용언어 : C언어, C++
1. 문제
N개의 색깔 중 하나의 색을 가지는 N개의 점이 직선 위에 주어짐
모든 점에 대해서 자신과 같은 색인 점 중 가장 가까운 곳까지의 길이의 합을 출력
같은 색인 점이 없으면 길이는 0으로 처리하고, 2개 이상이면 아무거나 선택
2. 풀이
모든 점으로부터 자신과 같은 색인 점을 찾고, 그 안에서 가장 가까운 점을 찾아야 합니다. 이 작업을 각각의 점에 대해서 매번 전체 순회하면서 찾으면 시간 복잡도가 O(N^2)이 되므로 TLE가 날 것 같습니다. (제출 해보진 않았습니다)
대신 전체를 아래 우선순위에 따라 정렬해두면 좌우에 있는 점만 확인하면 됩니다.1) 색깔 오름차순 (내림차순도 가능)2) 좌표 오름차순 (내림차순도 가능)
좌우에 있는 점이 유효하지 않은 경우(좌표 0 미만 or 좌표 N 이상 or 색이 다른 경우)
INF(1<<30)를 return하게 했고 좌우 모두 INF인 경우 0으로 처리하게 하면 됩니다.
그 외 설명은 아래 코드로 대체하겠습니다.
3. 코드
#ifndef _CRT_SECURE_NO_WARNINGS
#define _CRT_SECURE_NO_WARNINGS
#endif
#include <stdio.h>
#define ABS(X) (((X) > 0) ? (X) : (-(X)))
#define MIN(A, B) (((A) < (B)) ? (A) : (B))
#define INF (1 << 30)
const int LM = 100000;
int N;
struct _p {
int pos, color;
bool operator< (const _p &other) const {
if (color == other.color) return pos < other.pos;
return color < other.color;
}
} P[LM], *arr[LM], *tmp[LM];
void mergeSort(int s, int e) {
if (s >= e) return;
int m = (s + e) / 2;
mergeSort(s, m);
mergeSort(m + 1, e);
int i = s, j = m + 1, k = s;
while (i <= m && j <= e) {
if (*arr[i] < *arr[j]) tmp[k++] = arr[i++];
else tmp[k++] = arr[j++];
}
while (i <= m) tmp[k++] = arr[i++];
while (j <= e) tmp[k++] = arr[j++];
for (i = s; i <= e; ++i) arr[i] = tmp[i];
}
int getMinDist(int i, int dir) {
int j = i + dir;
if (j < 0 || j >= N) return INF;
if (arr[i]->color != arr[j]->color) return INF;
return ABS(arr[i]->pos - arr[j]->pos);
}
int main() {
scanf("%d ", &N);
for (int i = 0; i < N; ++i) {
scanf("%d %d", &P[i].pos, &P[i].color);
arr[i] = &P[i];
}
mergeSort(0, N - 1);
long long res = 0;
for (int i = 0; i < N; ++i) {
int left = getMinDist(i, -1);
int right = getMinDist(i, 1);
if (left == INF && right == INF) continue;
res += MIN(left, right);
}
printf("%lld\n", res);
return 0;
}
728x90
반응형
'개발자 > 문제풀이(C)' 카테고리의 다른 글
| [정올/JUNGOL] 8573번 모임 장소 (C/C++) (0) | 2026.06.25 |
|---|---|
| [정올/JUNGOL] 8577번 회의 정렬 (C/C++) (0) | 2026.06.21 |
| [정올/JUNGOL] 1692번 곱셈 (C/C++) (0) | 2026.06.21 |
| [정올/JUNGOL] 1291번 구구단 4 (C/C++) (0) | 2026.06.21 |
| [정올/JUNGOL] 1341번 구구단 3(C/C++) (0) | 2026.06.21 |
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 정올
- JUNGOL
- 알고리즘 리더
- 항상 이기는 조직
- 여가포인트
- 구구단 2
- 문현공
- 구구단 1
- 삼성전자
- 영화감상평
- 독서감상평
- 센터독서클럽
- 이상감지
- 시스템개발자
- 회의 정렬
- 아가별
- 똑똑하고게으르게
- 마침내 특이점이 시작된다
- 알고리즘
- 관계가상처가되기전에
- 화살표(고)
- 자동차보험
- 구구단 3
- 12338
- 자료구조
- 독서 감상평
- 12422
- 쿠프마케팅
- 나의첫죽음학수업
- 구구단 4
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 | 31 |
글 보관함
250x250
