포슀트

πŸŒ“ ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ ꡬλͺ…λ³΄νŠΈ CPP

ꡬλͺ…λ³΄νŠΈ

πŸ’Ž 첫 번째 풀이


  • μ½”λ“œ μ˜λ„ : 일단 μƒκ°λ‚˜λŠ”λŒ€λ‘œ 빨리 ν’€μ–΄λ³΄μž
  • κ²°κ³Ό : μ •ν™•μ„± 75점 (15/15), νš¨μœ¨μ„± 15점 (3/5), 총 90점
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
int solution(vector<int> people, int limit)
{
	int answer = 0;

	sort(people.begin(), people.end());

	while (people.size() > 0)
	{
		int i = people.size() - 1;
		if ((i != 0) && (people[0] + people[i] <= limit))
		{
			answer++;

			people.erase(people.begin() + i);
			if (people.size() >= 1)
				people.erase(people.begin());
		}
		else
		{
			answer++;
			people.erase(people.begin() + i);
		}
	}

	return answer;
}

μ²˜μŒμ—λŠ” λ‹¨μˆœνžˆ Vector μ—μ„œ Lightest 와 Heaviest μš”μ†Œλ₯Ό erase ν•¨μˆ˜λ₯Ό 톡해 μ§€μ›Œλ‚˜κ°€λ©΄μ„œ ν’€μ–΄λ‚˜κ°”λŠ”λ°,
이 방법은 μ •ν™•μ„± ν…ŒμŠ€νŠΈλŠ” λͺ¨λ‘ ν†΅κ³Όν–ˆμ§€λ§Œ, νš¨μœ¨μ„± ν…ŒμŠ€νŠΈμ—μ„œ 1번 3번 μ‹œκ°„ μ œν•œμ„ ν†΅κ³Όν•˜μ§€ λͺ»ν–ˆλ‹€.

κ·Έ μ΄μœ λŠ” 메인 λ£¨ν”„μ—μ„œ Lightest λ₯Ό μ œκ±°ν•΄λ‚˜κ°ˆ λ•Œ μ˜€λ²„ν—€λ“œκ°€ λ°œμƒν•΄μ„œμΈκ²ƒ κ°™λ‹€.

Vector μ—μ„œ νŠΉμ • μš”μ†Œλ‘€ erase 둜 μ œκ±°ν•˜λ©΄ ν•΄λ‹Ή μš”μ†Œμ˜ 곡간은 빈 곡간이 λ˜λŠ”λ°,
VectorλŠ” 순차 자료ꡬ쑰이기 λ•Œλ¬Έμ—, μ œκ±°ν•œ μš”μ†Œ λ’€μ˜ λͺ¨λ“  μš”μ†Œλ“€μ„ ν•œ μΉΈμ”© μ•žμœΌλ‘œ 땑겨 μž¬ν• λ‹Ήν•΄μ€€λ‹€.

λ‚΄ ν’€μ΄μ—μ„œλŠ” Vector 맨 μ•žμ—μ„œ μ‘΄μž¬ν•˜λŠ” Lightest λ₯Ό μ œκ±°ν•˜λŠ” κ²½μš°κ°€ λΉ„μΌλΉ„μž¬ν•˜κΈ°μ—,
이 κ³Όμ •μ—μ„œ μ˜€λ²„ν—€λ“œκ°€ 많이 λ°œμƒν–ˆμ„ κ²ƒμœΌλ‘œ μΆ”μΈ‘λœλ‹€.

문제 쑰건에 μ˜ν•΄ 무인도에 κ°‡νžŒ μ‚¬λžŒμ€ μ΅œλŒ€ 50000λͺ…μ΄λ―€λ‘œ, μ΅œμ•…μ˜ 경우, μš”μ†Œλ“€μ„ ν•œ μΉΈμ”© λ‹ΉκΈ°λŠ” 과정을 49998번, 49996번, 49994번, … μ§„ν–‰ν•˜κ²Œ λœλ‹€.

πŸ’Ž 두 번째 풀이


  • μ½”λ“œ μ˜λ„ : 속도.. 속도.. 속도..!
  • κ²°κ³Ό : μ •ν™•μ„± 75점 (15/15), νš¨μœ¨μ„± 15점 (5/5), 총 100점
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include <vector>
#include <algorithm>
#include <iostream>
#include <cmath>

using namespace std;

int solution(vector<int> people, int limit)
{
	int necessaryLifeBoatCount = 0;
	int count[241] = { };
	// Record Every Weight

	int first = 40;
	int end = 240;
	// First Will Be The Lightest Weight
	// End Will Be the Heaviest Weight

	for (int i = 0; i < people.size(); i++)
		count[people[i]]++;

	while (true)
	{
		if (first == end)
		{
			break;
		}

		if (count[first] == 0)
		{
			first++;
			continue;
		}

		if (count[end] == 0)
		{
			end--;
			continue;
		}

		// If The Sum Of Lightest Weight And Heaviest Weight Is Smaller Or Equals To The Limit
		// Ride Them A Boat
		if (first + end <= limit)
		{
			int temp = min(count[first], count[end]);
			count[first] -= temp;
			count[end] -= temp;
			necessaryLifeBoatCount += temp;
		}
		// If Not, The Heaviest People Can Only Ride A Boat By Themselves,
		// So Each Person With That Weight Picks Up One Boat
		else
		{
			necessaryLifeBoatCount += count[end];
			count[end] = 0;
		}
	}

	if (count[first] > 0)
	{
		if ((count[first] > 1) && (first + first <= limit))
		{
			necessaryLifeBoatCount += count[first] / 2;
			necessaryLifeBoatCount += count[first] % 2;
		}
		else
		{
			necessaryLifeBoatCount += count[first];
		}
	}

	return necessaryLifeBoatCount;
}

두 번째 ν’€μ΄μ—μ„œλŠ” 속도λ₯Ό μ΅œλŒ€ν•œ λ†’ν˜€λ³΄κ³ μž ν–ˆλ‹€.
μ‹€μ œλ‘œ 이 ν’€μ΄λŠ” λ‚΄ 풀이 쀑 κ°€μž₯ λΉ λ₯Έ 풀이이기도 ν•˜λ‹€.

이 ν’€μ΄μ—μ„œλŠ” 마치 μΉ΄μš΄νŒ… μ •λ ¬μ²˜λŸΌ,
Count 배열을 λ§Œλ“€κ³ , 거기에 각 인덱슀λ₯Ό 무게 둜 ν•˜λŠ” μ‚¬λžŒ 수λ₯Ό μ €μž₯ν–ˆλ‹€.

예λ₯Ό λ“€μ–΄ Input 으둜 λ“€μ–΄μ˜¨ People 이 [ 40, 50, 80, 40, 90 ] 이라면,
Count[40] 은 40KG 인 μ‚¬λžŒμ˜ 수인 2이닀.

이런 Count 배열을 λ§Œλ“€μ–΄μ€€ μ΄μœ λŠ” 두 가지가 μžˆλ‹€.
μ „μ œλŠ” μ‚¬λžŒμ˜ λ¬΄κ²Œκ°€ 40KG ~ 240KG으둜 비ꡐ적 쒁은 λ²”μœ„λ‘œ ν•œμ •λ˜μ–΄ μžˆλŠ”λ°, μ‚¬λžŒμ˜ μˆ˜λŠ” 1λͺ… ~ 50,000λͺ…μ΄λ‚˜ λœλ‹€λŠ” 것.

  1. λ•Œλ¬Έμ— 같은 λͺΈλ¬΄κ²Œλ₯Ό 가진 μ‚¬λžŒμ΄ λ§Žμ„ 것이고, 이둜 인해 μ€‘λ³΅λ˜λŠ” μ²˜λ¦¬κ°€ λ§Žμ„ 것이라고 μƒκ°ν–ˆλ‹€. 이런 μ€‘λ³΅λœ μ²˜λ¦¬λ“€μ„ Count 배열을 μ΄μš©ν•΄ ν•œ λ²ˆμ— μ²˜λ¦¬ν•˜κ³ μž ν–ˆλ‹€.
  2. 그리고 그리디 이기 λ•Œλ¬Έμ— λͺ¨λ“  μš”μ†Œμ— 접근을 ν•΄μ•Όν•˜λŠ”λ°, Vectorλ₯Ό 인덱슀둜 μ ‘κ·Όν•˜λŠ” 것보닀, 배열을 인덱슀둜 μ ‘κ·Όν•˜λŠ” 것이 속도가 훨씬 λΉ¨λžλ‹€.

여기에 두 개의 포인터 (μ£Όμ†Œλ₯Ό κ°€λ¦¬ν‚€λŠ” 포인터가 μ•„λ‹ˆλΌ 말 κ·ΈλŒ€λ‘œ 포인터) λ₯Ό λ§Œλ“€μ—ˆλ‹€.

Lightest : ν˜„μž¬ 무인도에 λ‚¨μ•„μžˆλŠ” μ‚¬λžŒλ“€ 쀑 κ°€μž₯ κ°€λ²Όμš΄ μ‚¬λžŒμ˜ 무게
Heaviest : ν˜„μž¬ 무인도에 λ‚¨μ•„μžˆλŠ” μ‚¬λžŒλ“€ 쀑 κ°€μž₯ 무거운 μ‚¬λžŒμ˜ 무게

Count λ°°μ—΄μ—μ„œμ˜ μΈλ±μŠ€λŠ” μ‚¬λžŒμ˜ λ¬΄κ²Œμ™€ λŒ€μ‘λ˜λ―€λ‘œ,
Count[Lightest] λŠ” κ°€μž₯ κ°€λ²Όμš΄ 무게의 μ‚¬λžŒ 수, Count[Heaviest] λŠ” κ°€μž₯ 무거운 무게의 μ‚¬λžŒ 수λ₯Ό μ˜λ―Έν•œλ‹€.

이λ₯Ό μ΄μš©ν•΄ 메인 λ£¨ν”„λŠ” 맀 반볡 λ§ˆλ‹€, μ•„λž˜ 두 가지 μž‘μ—… 쀑 ν•œ μž‘μ—…μ„ μ‹€ν–‰ν•œλ‹€.

  • Lightest 와 Heaviest 두 λͺ…을 λ³΄νŠΈμ— νƒœμ›Œ κ΅¬μΆœν•œλ‹€.
  • Heaviest ν•œ λͺ…λ§Œ λ³΄νŠΈμ— νƒœμ›Œ κ΅¬μΆœν•œλ‹€.

Lightest 와 Heaviest 의 무게 합이 ꡬλͺ…λ³΄νŠΈ 무게 μ œν•œμ„ λ„˜μ§€ μ•ŠμœΌλ©΄,
Lightest 와 Heaviest 두 λͺ…을 λ³΄νŠΈμ— νƒœμ›Œλ³΄λ‚΄κ³ ,

Lightest 와 Heaviest 의 무게 합이 ꡬλͺ…λ³΄νŠΈ 무게 μ œν•œμ„ λ„˜μ§€ μ•ŠμœΌλ©΄,
Heaviest λŠ” ν˜Όμžμ„œ 밖에 보트λ₯Ό νƒˆ 수 μ—†μœΌλ―€λ‘œ 혼자 λ³΄νŠΈμ— νƒœμ›Œ κ΅¬μΆœν•œλ‹€.
(κ°€μž₯ κ°€λ²Όμš΄ Lightest λž‘ 짝을 μ§€μ—ˆμŒμ—λ„ 무게 μ œν•œμ„ λ„˜μœΌλ―€λ‘œ)

πŸ’Ž μ΅œμ’… 풀이


  • μ½”λ“œ μ˜λ„ : 속도.. 그리고 가독성
  • κ²°κ³Ό : μ •ν™•μ„± 75점 (15/15), νš¨μœ¨μ„± 15점 (5/5), 총 100점
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <vector>
#include <algorithm>

using namespace std;

int solution(vector<int> people, int limit)
{
	int boatCount = 0;
	int lightest = 0;
	int heaviest = people.size() - 1;

	sort(people.begin(), people.end());

	while (lightest <= heaviest)
	{
		if (people[lightest] + people[heaviest] <= limit)
			lightest++;

		heaviest--;
		boatCount++;
	}

	return boatCount;
}

μ½”ν…Œ μŠ€ν„°λ”” λͺ¨μž„μ—μ„œ 회의λ₯Ό ν•΄λ³΄λ‹ˆ,
λ‹€λ₯Έ 두 νŒ€μ› 뢄듀은 λͺ¨λ‘ μ΄λŸ°μ‹μœΌλ‘œ ν‘Έμ…¨μ—ˆλ‹€.

기본적인 μ•Œκ³ λ¦¬μ¦˜ μžμ²΄λŠ” κΈ°μ‘΄κ³Ό λΉ„μŠ·ν•˜κ³ , κ΅¬ν˜„μ€ 첫 번째 풀이와 두 번째 풀이λ₯Ό μ„žμ€ κ²ƒμ²˜λŸΌ λ‹¬λΌμ‘Œλ‹€.
이 ν’€μ΄λŠ” 첫 번째 ν’€μ΄μ²˜λŸΌ Vectorλ₯Ό μ΄μš©ν•˜λ˜, μ΄λ²ˆμ—λŠ” μš”μ†Œλ₯Ό μ§€μš°μ§€λŠ” μ•Šκ³ ,
두 번째 ν’€μ΄μ²˜λŸΌ Lightest 와 Heaviest 두 개의 포인터λ₯Ό μ΄μš©ν•΄ ν˜„μž¬ κ³Όμ •μ—μ„œ μ²˜λ¦¬ν•  μš”μ†Œλ₯Ό κ²°μ •ν•œλ‹€.

μ†λ„λŠ” 두 번째 풀이가 훨씬 더 λΉ λ₯΄κΈ΄ ν•˜μ§€λ§Œ, (μ •ν™•μ„± ν…ŒμŠ€νŠΈμ—μ„œ, μ•½ .01ms VS μ•½ .03ms)
이 ν’€μ΄μ˜ 가독성이 전보닀 훨씬 μ’‹λ‹€κ³  μƒκ°ν–ˆκΈ°μ— 이λ₯Ό μ΅œμ’… ν’€μ΄λ‘œ κ²°μ •ν–ˆλ‹€.

이 κΈ°μ‚¬λŠ” μ €μž‘κΆŒμžμ˜ CC BY 4.0 λΌμ΄μ„ΌμŠ€λ₯Ό λ”°λ¦…λ‹ˆλ‹€.