mojo's Blog

구명보트 본문

프로그래머스/Level 2

구명보트

_mojo_ 2021. 9. 10. 13:25

문제 링크 => 코딩테스트 연습 - 구명보트 | 프로그래머스 (programmers.co.kr)

 

코딩테스트 연습 - 구명보트

무인도에 갇힌 사람들을 구명보트를 이용하여 구출하려고 합니다. 구명보트는 작아서 한 번에 최대 2명씩 밖에 탈 수 없고, 무게 제한도 있습니다. 예를 들어, 사람들의 몸무게가 [70kg, 50kg, 80kg, 5

programmers.co.kr


이 문제에서 핵심은 구명보트는 작아서 한 번에 최대 2명씩 밖에 탈 수 없다.

 

그리고 구명 보트는 무게 제한이 있다.

 

예를 들어서 x kg, y kg 의 합 (x + y) kg 에 대하여 (x + y) <= limit 을 만족해야만 2명이 동시에 구명보트를 탈 수 있고 그 외에는 따로따로 타야 한다는 점이 있다.

 

먼저 parameter로 받아온 vector에 대하여 오름차순으로 sorting 을 한다.

 

그 후에 deque에 push를 하고 다음과 같은 과정을 반복한다.

 

1. dq size가 1인 경우 1을 counting 후 빠져나오고 5번으로 이동한다.

2. x = front(), y = back() 에 존재하는 값을 가져온다. (가장 적은 몸무게, 가장 큰 몸무게)

3. (x + y) <= limit 인 경우 =>  2를 counting 하고 front, back에 존재하는 값을 pop

    (x + y) > limit 인 경우 => 1를 counting 하고 back 에 존재하는 값만 pop (가장 작은 값은 pop 하지 않음)

4. 1번으로 돌아간다.

5. 최종 counting 값을 return 한다.

 

풀이 Code

 

#include <string>
#include <vector>
#include <algorithm>
#include <queue>

using namespace std;

int solution(vector<int> people, int limit) {
	int answer = 0;
	sort(people.begin(), people.end());

	deque<int> dq;

	for (int i = 0; i < people.size(); i++) {
		dq.push_back(people[i]);
	}

	int cnt = 0;
	while (!dq.empty()) {
		if (dq.size() == 1) {
			cnt++;
			break;
		}

		int x = dq.front();
		int y = dq.back(); 

		if (x + y <= limit) {
			dq.pop_front(); 
			dq.pop_back();
		}
		else {
			dq.pop_back();
		}
		cnt++;
	}

	return cnt;
}

'프로그래머스 > Level 2' 카테고리의 다른 글

오픈채팅방  (0) 2021.09.07
H-Index  (0) 2021.09.07
위장  (0) 2021.09.07
124 나라의 숫자  (0) 2021.09.07
소수 찾기  (0) 2021.09.06
Comments