본문 바로가기

BAEKJOON/그리디

백준 17262번 [팬덤이 넘쳐흘러](C++) -yes6686- 티스토리

728x90
SMALL

백준 문제 풀이: 17262


문제 링크: https://www.acmicpc.net/problem/17262

문제 설명:

여러 사람의 도착 시간(s)과 떠나는 시간(e)이 주어질 때, 모두가 한 번에 머무를 수 없는 시간의 길이를 계산하는 문제입니다. 만약 모두가 한 번에 머무를 수 있다면, 결과는 0입니다.


문제 해결 코드


// 팬덤이 넘쳐흘러 문제의 최적화된 코드
#include <iostream>
#include <algorithm> // max, min 함수 사용
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(NULL);

    int n; // 사람의 수
    cin >> n;

    int maxArrival = -1; // 가장 늦은 도착 시간
    int minDeparture = 100001; // 가장 빠른 떠나는 시간

    // 각 사람의 도착 및 떠나는 시간 입력
    for (int i = 0; i < n; i++) {
        int arrival, departure;
        cin >> arrival >> departure;
        maxArrival = max(maxArrival, arrival); // 도착 시간의 최댓값 갱신
        minDeparture = min(minDeparture, departure); // 떠나는 시간의 최솟값 갱신
    }

    // 결과 계산 및 출력
    int result = max(0, maxArrival - minDeparture); // 모두가 머무를 수 없는 시간
    cout << result << '\n';

    return 0;
}

코드 설명

코드의 주요 로직과 사용된 알고리즘 설명:

  • 핵심 알고리즘: 각 사람의 도착 시간 중 최댓값과 떠나는 시간 중 최솟값을 비교합니다. 최댓값이 최솟값보다 크면, 그 차이를 결과로 출력합니다.
  • 구현 세부사항:
    • maxArrival: 모든 사람의 도착 시간 중 최댓값을 저장합니다.
    • minDeparture: 모든 사람의 떠나는 시간 중 최솟값을 저장합니다.
    • max(0, maxArrival - minDeparture): 만약 도착 시간이 떠나는 시간보다 작다면 모두가 머무를 수 있는 경우이므로 결과는 0입니다. 그렇지 않으면 그 차이를 출력합니다.
  • 시간 복잡도 분석:
    • 입력 처리: O(n) (각 사람의 도착 및 떠나는 시간 확인)
    • 전체 시간 복잡도: O(n)

결과

위 코드는 문제의 조건을 효율적으로 처리하며, 입력 크기가 커도 O(n) 시간 안에 해결할 수 있습니다. 간결하고 명확한 구현으로 가독성을 높였습니다.

다른 접근 방식이나 개선 사항이 있다면 댓글로 공유 부탁드립니다!

728x90
LIST