1. 문제 링크

www.acmicpc.net/problem/11399

 

11399번: ATM

첫째 줄에 사람의 수 N(1 ≤ N ≤ 1,000)이 주어진다. 둘째 줄에는 각 사람이 돈을 인출하는데 걸리는 시간 Pi가 주어진다. (1 ≤ Pi ≤ 1,000)

www.acmicpc.net

 

 

 

2. 문제 설명

줄을 서 있는 사람의 수와 각 사람이 돈을 인출하는데 걸리는 시간을 입력받은 후,

각 사람이 돈을 인출하는데 필요한 시간의 합의 최솟값을 출력하는 문제입니다.

 

 

 

3. 소스코드

BOJ 11399번 ATM C++ 풀이입니다.

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main(void)
{
	ios::sync_with_stdio(0);
	cin.tie(0);

	int N, P;
	vector<int> v;

	cin >> N;
	for (int i = 0; i < N; i++) {
		cin >> P;
		v.push_back(P);
	}

	sort(v.begin(), v.end());
	int result = 0;
	for (int i = 0; i < N; i++)
		// for (int j = 0; j <= i; j++)
		// 	result += v[j];
		result += v[i] * (N - i);
	cout << result;

	return 0;
}

 

20번 라인 : 최솟값을 구하려면 돈을 인출하는데 필요한 시간이 적게 걸리는 사람부터 인출해야 하므로 오름차순으로 정렬합니다.

22 ~ 24번 라인 : 3명의 사람이 있다고 가정하고 돈을 인출하는데 필요한 시간을 오름차순으로 정렬했다고 가정하면,

v[0], v[0] + v[1], v[0] + v[1] + v[2]이므로 이중 for문을 이용하여 구할 수 있습니다.

25번 라인 : 위의 예제를 살펴보면 v[0]은 3번, v[1]은 2번, v[2]는 1번 더하는 것을 알 수 있습니다.

따라서 23, 24번 라인의 for문을 사용하지 않고, 25번 라인의 식을 이용하여 단일 for문으로도 풀 수 있습니다.

1. 문제 링크

www.acmicpc.net/problem/2309

 

2309번: 일곱 난쟁이

아홉 개의 줄에 걸쳐 난쟁이들의 키가 주어진다. 주어지는 키는 100을 넘지 않는 자연수이며, 아홉 난쟁이의 키는 모두 다르며, 가능한 정답이 여러 가지인 경우에는 아무거나 출력한다.

www.acmicpc.net

 

 

 

2. 문제 설명

아홉 난쟁이의 키를 입력받아 키의 합이 100이 되는 일곱 난쟁이를 찾아 오름차순으로 출력하는 문제입니다.

 

 

 

3. 소스코드

BOJ 2309번 일곱 난쟁이 C++ 풀이입니다.

#include <iostream>
#include <algorithm>
using namespace std;

int main(void)
{
	ios::sync_with_stdio(0);
	cin.tie(0);

	int arr[9];
	int sum = 0;
	for (int i = 0; i < 9; i++) {
		cin >> arr[i];
		sum += arr[i];
	}

	sort(arr, arr + 9);
	for (int i = 0; i < 8; i++) {
		for (int j = i + 1; j < 9; j++) {
			if (sum - arr[i] - arr[j] == 100) {
				for (int k = 0; k < 9; k++) {
					if (k != i && k != j)
						cout << arr[k] << '\n';
				}
				return 0;
			}
		}
	}

	return 0;
}

 

13, 14번 라인 : 아홉 난쟁이의 키를 입력받으면서 동시에 키의 합을 구합니다.

17번 라인 : 오름차순으로 출력하기 위해 정렬합니다.

18, 19번 라인 : i, j에 0~8까지 수에서 2개를 뽑는 조합을 모두 대입합니다. (0,1 ~ 7,8)

20번 라인 : 아홉 난쟁이의 키의 합에서 i번째 난쟁이와 j번째 난쟁이의 키를 빼서 100이 되는지 확인합니다.

21 ~ 24번 라인 : 20번 라인에서 100이 된다면 정답이므로 i번째 난쟁이와 j번째 난쟁이를 제외한 난쟁이의 키를 출력합니다.

25번 라인 : 정답이 여러 개인 경우 하나만 출력해야 하므로 프로그램을 종료합니다. (break를 사용할 경우 19번 for문만 탈출합니다.)

1. 문제 링크

www.acmicpc.net/problem/10814

 

10814번: 나이순 정렬

온라인 저지에 가입한 사람들의 나이와 이름이 가입한 순서대로 주어진다. 이때, 회원들을 나이가 증가하는 순으로, 나이가 같으면 먼저 가입한 사람이 앞에 오는 순서로 정렬하는 프로그램을 �

www.acmicpc.net

 

 

 

2. 문제 설명

나이와 이름을 입력받은 후, 나이가 증가하는 순으로, 나이가 같으면 먼저 가입한 사람이 앞에 오는 순서로 정렬하여 출력하는 문제입니다.

 

 

 

3. 소스코드

BOJ 10814번 나이순 정렬 C++ 풀이입니다.

#include <iostream>
#include <algorithm>
using namespace std;

pair<int, string> p[100000];

bool comp(pair<int, string> p1, pair<int, string> p2)
{
	return p1.first < p2.first;
}

int main(void)
{
	ios::sync_with_stdio(0);
	cin.tie(0);

	int N;
	cin >> N;
	for (int i = 0; i < N; i++)
		cin >> p[i].first >> p[i].second;

	stable_sort(p, p + N, comp);
	for (int i = 0; i < N; i++)
		cout << p[i].first << ' ' << p[i].second << '\n';

	return 0;
}

나이가 같으면 가입한 순서대로 정렬되어야 하므로 stable_sort함수를 이용하여 풀었습니다.

sort함수를 사용하면 나이가 같을 때, 가입한 순서와 다르게 정렬되는 경우가 있으므로 틀립니다.

pair의 경우 first(나이), second(이름) 순서로 정렬되는데,

이 문제에서 second(이름)는 정렬되면 안 되기 때문에 직접 comp함수를 만들어서 first만 비교하도록 구현했습니다.

+ Recent posts