[백준 2303번] 숫자 게임 C/C++

Jo·2021년 7월 16일
0
post-thumbnail

https://www.acmicpc.net/problem/2303

숫자 게임

문제

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사이의 정수가 다섯 개씩 주어진다. 각 정수 사이에는 한 개의 빈칸이 있다.

출력

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

풀이

문제 조건을 요약하자면 다음과 같다.
1. 각 3개의 카드를 선택했을 때 일의 자릿수의 최댓값을 구한다.
2. 그중에서 최댓값을 구한다.
3. 같은 값이 있을 경우 더 큰 번호의 수로 승자를 결정한다.

사람도 1000명 제한이 있고, 5C3이기 때문에 경우의 수가 그리 많은 편은 아니다. 따라서 별 알고리즘 없이 중첩for반복문을 이용하여 다수 무식한(..)방법으로 풀어도 풀리는 문제이다. 나는 중첩반복문을 이용하여 풀었다.

c++로 풀었지만 c로 똑같이 풀어도 아무 문제 없다. 내가 푼 풀이는 다음과 같다.

#include <iostream>
using namespace std;

int c[1000][5]; //카드값 저장 배열
int score[1000]; //합의 일의 자리수 최대값

int main() {

	int input;  
	cin >> input; //사람 수 입력
	for (int i = 0; i < input; i++) {
		for (int j = 0; j < 5; j++){
			cin >> c[i][j]; //카드값 c에 저장
		}
	}
	int max = 0; //일의 자리 수가 가장 큰 경우의 값
	int num = 0; //max값일때 인덱스
    
    //각 사람별 합의 일의 자리수 최대값 구하는 과정
	for (int i = 0; i < input; i++) {
		for (int j = 0; j < 5; j++) {
			for (int k = j + 1; k < 5; k++) {
				for (int l = k + 1; l < 5; l++) {
					if (score[i] < (c[i][j] + c[i][k] + c[i][l])%10)
						score[i] = (c[i][j] + c[i][k] + c[i][l])%10;
				}
			}
		}
	}

    //일의 자리 수가 가장 큰 경우와, 해당 인덱스 구하기 
	for (int i = 0; i < input; i++) {
		if (max < score[i]) {
			max = score[i];
			num = i;
		}
        //값이 같은 경우 더 큰 번호로 저장
		if (max == score[i]) {
			if (i > num) num = i;
		}
	}
	cout << num+1 << endl;

	return 0;
}
profile
이것저것 배우고 싶은 대학생

0개의 댓글