포스트

Pr.14469 소가 길을 건넌 이유

Pr.14469 소가 길을 건너간 이유

문제

이웃 농장의 소가 길을 마구잡이로 건너는 것에 진절머리가 난 존은 극단의 결정을 내린다. 농장 둘레에 매우 큰 울타리를 짓는 것이다. 이렇게 하면 근처 농장 출신의 소가 들어올 일이 거의 없다. 이 일로 주변 소들이 분개하였다. 친구네 집에 놀러 갈 수 없을 뿐만 아니라, 매년 참가하던 국제 젖 짜기 올림피아드에도 올해는 참가할 수 없게 되었기 때문이다.

이웃 농장의 소 중 존의 농장에 방문할 수 있는 소가 조금 있긴 하지만, 그들도 안심할 수 있는 건 아니다. 존의 농장에 들어가는 문은 하나밖에 없고, 그 문을 통과하려면 감시관의 길고 긴 검문을 받아야 한다. 여러 마리의 소가 한 번에 들어가려고 하면 줄이 그 만큼 길어진다.

N마리의 소가 이 농장에 방문하러 왔다. 소가 도착한 시간과 검문받는 데 걸리는 시간은 소마다 다르다. (물론 같을 수도 있다.) 두 소가 동시에 검문을 받을 수는 없다. 예를 들어, 한 소가 5초에 도착했고 7초 동안 검문을 받으면, 8초에 도착한 그 다음 소는 12초까지 줄을 서야 검문을 받을 수 있다.

모든 소가 농장에 입장하려면 얼마나 걸리는 지 구해보자.

입력

첫 줄에 100 이하의 양의 정수 N이 주어진다. 다음 N줄에는 한 줄에 하나씩 소의 도착 시각과 검문 시간이 주어진다. 각각 1,000,000 이하의 양의 정수이다.

출력

모든 소가 농장에 입장하는 데 걸리는 최소 시간을 출력한다.

예제 입력

1
2
3
4
3
2 1
8 3
5 7

예제 출력

1
15

풀이과정

전제조건

  1. 시간 복잡도, 공간 복잡도
    • 시간복잡도 : N이 100 이므로 최악의 시간 복잡도 100! -> 단순구현 불가
    • 공간복잡도 : 100 이므로 벡터 n(100)의 복잡도
  2. 최대, 최소 조건
    • n의 길이 : 100
    • 시간 : 1,000,000
  3. 사용 알고리즘
    • 정렬을 통한 그리디
    • 도착 시간 기준으로 정렬
    • 현재시간과 도착시간을 비교
    • 현재시간 > 도착시간 : 현재시간 + 검사시간
    • 현재시간 < 도착시가 : 도착시간 + 검사시간
  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
#include <bits/stdc++.h>
using namespace std;

int n, arrive, test, res;
vector<pair<int, int>> v;

int main(){
  cin >> n;
  for (int i = 0; i < n; i++){
    cin >> arrive >> test;
    v.push_back({arrive, test});
  }
  sort(v.begin(), v.end());

  for (int i = 0; i < n; i++){
    if (res < v[i].first){
      res = v[i].first + v[i].second;
    }
    else{
      res += v[i].second;
    }
  }
  cout << res << '\n';
  return 0;
}

해설

생각해볼 점

정답 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<bits/stdc++.h>

using namespace std;
int n;
int main(){
	cin >> n; 
	vector<pair<int,int>> a(n);
	for(int i =0; i < n; i++) cin >> a[i].first >> a[i].second;
	sort(a.begin(),a.end()); 
	int realTime = a[0].first + a[0].second;
	for(int i = 1; i < a.size(); i++){
		realTime = max(realTime, a[i].first);
		realTime += a[i].second;
	}
	cout << realTime << "\n"; 
    return 0;
}
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.