Software Hyena::

[백준 2303번] - 숫자 게임 / C++ (2차원 벡터, 정렬) 본문

알고리즘/백준

[백준 2303번] - 숫자 게임 / C++ (2차원 벡터, 정렬)

bluehyena 2021. 2. 23. 00:11
반응형

 

www.acmicpc.net/problem/2303

 

2303번: 숫자 게임

N명이 모여 숫자 게임을 하고자 한다. 각 사람에게는 1부터 10사이의 수가 적혀진 다섯 장의 카드가 주어진다. 그 중 세 장의 카드를 골라 합을 구한 후 일의 자리 수가 가장 큰 사람이 게임을 이

www.acmicpc.net

문제

N명이 모여 숫자 게임을 하고자 한다. 각 사람에게는 1부터 10사이의 수가 적혀진 다섯 장의 카드가 주어진다. 그 중 세 장의 카드를 골라 합을 구한 후 일의 자리 수가 가장 큰 사람이 게임을 이기게 된다. 세 장의 카드가 (7, 8, 10)인 경우에는 합은 7+8+10 = 25가 되고 일의 자리 수는 5가 된다. 어떤 사람이 받은 카드가 (7, 5, 5, 4, 9)인 경우 (7, 4, 9)를 선택하면 합이 20이 되어 일의 자리 수는 0이 되고, (5, 5, 9)를 선택하면 합이 19가 되어 일의 자리 수는 9가 된다. 게임을 이기기 위해서는 세 장의 카드를 선택할 때 그 합의 일의 자리 수가 가장 크게 되도록 선택하여야 한다.

예를 들어, N=3일 때

  • 1번 사람이 (7, 5, 5, 4, 9),
  • 2번 사람이 (1, 1, 1, 1, 1),
  • 3번 사람이 (2, 3, 3, 2, 10)의 

카드들을 받았을 경우, 세 수의 합에서 일의 자리 수가 가장 크게 되도록 세 수를 선택하면

  • 1번 사람은 (5, 5, 9)에서 9,
  • 2번 사람은 (1, 1, 1)에서 3,
  • 3번 사람은 (2, 3, 3)에서 8의

결과를 각각 얻을 수 있으므로 첫 번째 사람이 이 게임을 이기게 된다.

N명에게 각각 다섯 장의 카드가 주어졌을 때, 세 장의 카드를 골라 합을 구한 후 일의 자리 수가 가장 큰 사람을 찾는 프로그램을 작성하시오. 가장 큰 수를 갖는 사람이 두 명 이상일 경우에는 번호가 가장 큰 사람의 번호를 출력한다.

입력

첫 줄에는 사람의 수를 나타내는 정수 N이 주어진다. N은 2이상 1,000이하이다. 그 다음 N 줄에는 1번부터 N번까지 각 사람이 가진 카드가 주어지는 데, 각 줄에는 1부터 10사이의 정수가 다섯 개씩 주어진다. 각 정수 사이에는 한 개의 빈칸이 있다.

출력

게임에서 이긴 사람의 번호를 첫 번째 줄에 출력한다. 이긴 사람이 두 명 이상일 경우에는 번호가 가장 큰 사람의 번호를 출력한다.

---------------------------------------------------------------------------------------------------------

풀이

<C++>

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

vector<vector<int>> arr;
vector<vector<int>> arr_case;

bool Descending(int a, int b) {
	return a > b;
}

int main() {
	int N;
	cin >> N;

	int num;

	for (int i = 0; i < N; ++i) {
		vector<int> a;
		for (int j = 0; j < 5; ++j) {
			cin >> num;
			a.push_back(num);
		}
		arr.push_back(a);
	}

	for (int l = 0; l < N; ++l) {
		int index = 0;
		vector<int> a;
		for (int i = 0; i < 2; ++i) {
			for (int j = i + 1; j < 4; ++j) {
				for (int k = j + 1; k < 5; ++k) {
					a.push_back((arr[l][i] + arr[l][j] + arr[l][k]) % 10);
					++index;
				}
			}
		}
		arr_case.push_back(a);
	}

	for (int i = 0; i < N; ++i) {
		sort(arr_case[i].begin(), arr_case[i].end(), Descending);
	}

	int answer_index = 0;
	int answer_num = 0;

	for (int i = 0; i < N; ++i) {
		if (max(arr_case[i][0], answer_num) == arr_case[i][0]) {
			answer_index = i;
			answer_num = arr_case[i][0];
		}
	}

	cout << answer_index + 1;

	return 0;
}

2차원 벡터, 2차원 벡터의 정렬이 핵심인 문제이다.

 

1. N을 입력받는다.

2. 5개의 숫자를 입력받아 벡터에 넣고, 이 벡터를 큰 벡터에 넣는다.

3. 5개의 숫자로 가능한 조합을 다른 2차원 벡터에 넣는다.

 - ex) 1,2,3,4,5가 입력으로 들어왔다고 하면 {1,2,3},{1,2,4},{1,2,5},{1,3,4},{1,4,5},{2,3,4},{2,3,5},{2,4,5},{3,4,5} 의 케이스가 존재한다. 이를 3중 for문으로 케이스들의 합의 1의 자리를 구해 벡터에 채워준다.

4. 두번째 2차원 벡터를 내림차순으로 정렬한다.

5. 가장 큰 수를 가지는 index를 찾는다. (같은 경우 인덱스가 제일 큰 것으로)

6. index + 1을 출력한다.

반응형
Comments