Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 운영체제
- 혼자공부하는
- 131701
- C++
- 인터럽트
- DDR SDRAM
- 스레드
- DirectX
- 138477
- 독학
- 장치컨트롤러
- 그래프
- 프로그래머스
- 컴퓨터 구조
- CPU 스케줄링
- Transform
- 한빛미디어
- static
- BFS
- 프로세스
- 컴퓨터구조
- 풀이
- 보조기억장치
- dfs
- 혼자 공부하는
- 입출력장치
- 멀티스레드
- 코딩테스트
- 지역변수
- 렌더링 파이프라인
Archives
- Today
- Total
빼미의 개발일기
[프로그래머스][Lv.2] - 구명보트 본문
● 소감
- 이게 왜 탐욕법인지 모르겠다.
● 나의 풀이
더보기
1) 문제 이해
- 탐욕법이라는데... 뭐 우선은 가장 가벼운 사람과 가장 무거운 사람을 비교해서 limit 안에 들어가면 보트에 태우면 되기 때문에 정렬이 필요하다고 생각했다. 정렬 후 left와 right를 증가 감소, 혹은 left만 증가 하는 식으로 비교하면 구할 수 있을 것이다.
2) 조건 찾기
- 정렬은 sort()로 간단히 할 수 있고, left는 0부터 right는 제시된 백터 people의 size의 -1 (배열순서니까)로 지정.
- 그리고 2명의 보트를 태운 경우의 변수도 만들었다.
sort(people.begin(), people.end(), greater<int>());
int left = 0;
int right = people.size() - 1;
int fullboat = 0;
3) 누구누구를 같이 보트에 태울까?
- 정렬된 왼쪽은 가장 무거운 사람, 오른쪽은 가벼운 사람이다.(greater<>() 정렬 기준). 각 인원을 더해보고 limit 보다 작거나 같다면 left와 right를 각각 증가 감소 시켜주면 되고, limit 보다 크다면 다음 무거운 사람과 더하고 비교해준다.
- 이를 left가 right의 값보다 커지거나 같아질 때까지 반복해준다.
while(left < right)
{
if(people[left] + people[right] <= limit)
{
left++, right--;
fullboat++;
}
else
left++;
}
● 내가 작성한 답
더보기
int solution(vector<int> people, int limit)
{
sort(people.begin(), people.end(), greater<int>());
int left = 0;
int right = people.size() - 1;
int fullboat = 0;
while(left < right)
{
if(people[left] + people[right] <= limit)
{
left++, right--;
fullboat++;
}
else
left++;
}
return fullboat + (people.size() - fullboat * 2);
}
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
[프로그래머스][Lv.2] - 멀리뛰기 (1) | 2023.12.30 |
---|---|
[프로그래머스][Lv.1] - 콜라 문제 (0) | 2023.12.29 |
[프로그래머스][Lv.2] - 점프와 순간 이동 (0) | 2023.12.29 |
[프로그래머스][Lv.2] - 예상대진표 (0) | 2023.12.29 |
[프로그래머스][Lv.2] - 프로세스 (1) | 2023.12.02 |
Comments