문제출처: https://www.acmicpc.net/problem/12760


문제

수많은 토너먼트를 거쳐 최종 플레이어 N명이 남아있다. 각 플레이어는

M장씩의 숫자가 적힌 카드를 가지고 있으며, 이들은 매 턴 자신이 가진 카드 중 가장 큰 카드를

두고 비교를 하는데, 그 카드들 중 가장 큰 수를 가진 플레이어가 1점을 획득한다. 그 턴에

사용된 카드는 버리기로 한다. ( 가장 큰 수를 가진 플레이어는 여러 명일 수 있다. )

M번의 경기 후 가장 많은 점수를 획득한 플레이어는 몇 번 플레이어인가 ?


입력

입력의 첫 줄에 플레이어의 수 N과 가진 카드 수 M이 입력 된다. (2N100,1M100)

그 다음 N줄에 걸쳐 각 플레이어가 들고 있는 카드에 적힌 숫자들이 입력된다. (1 카드에 적힌 숫자 100)


출력

최종 승자의 번호를 출력한다.

플레이어의 번호는 1번부터 N번까지 입력받은 순서로 주어진다고 가정한다.

가장 많은 점수를 획득한 플레이어가 여러 명일 경우, 빈칸을 사이에 두고 플레이어들의

번호를 오름차순으로 출력한다.


풀이

규칙찾기문제는 규칙만 찾으면  구현이 쉬운반면 이런 시뮬레이션 구현문제는 확실히 기본적인 구현능력이 있느냐 없느냐를 판단하기에 좋은 것 같습니다. 말그대로 생각한 것을 그대로 소스로 구현하는 능력이 필요합니다. (기업의 코딩테스트가 어려운 알고리즘 문제가 아닌 시뮬레이션,구현문제를 많이 내는 이유가 이런 것 때문 아닐까요??)

소스코드를 보면 알겠지만 말그대로 의식의 흐름대로 풀어나갔습니다. 어려운 내용은 없고 설명은 주석으로 대체하겠습니다.


코드

#include<iostream>
#include<algorithm>
using namespace std;
int arr[100][100];
int score[100];
int main()
{
	int n, m;
	cin >> n >> m;
	for (int i = 0; i < n; i++) 
	{
		for (int j = 0; j < m; j++) 
			cin >> arr[i][j];
		sort(arr[i], arr[i] + m);
	}
	//갖고있는 3장씩의 카드중
	for (int i = 0; i < m; i++)
	{
		//값을 비교할 초깃값을 0으로설정
		int temp = 0;
		//가장 큰값구하고
		for (int j = 0; j < n; j++)
			temp = max(temp, arr[j][m - i - 1]);
		//구해진 가장 큰값을 가진 사람점수++;
		for (int j = 0; j < n; j++)
			if (temp == arr[j][m - i - 1])
				score[j]++;
	}
	//가장큰 값을 구하고,
	int max_score = 0;
	for (int i = 0; i < n; i++)
		max_score = max(max_score, score[i]);
	//그 값을 가지는 사람을 출력
	for (int i = 0; i < n; i++)
		if (max_score == score[i])
			cout << i + 1 << " ";
	cout << endl;
}


결과


'문제풀이(BOJ) > 시뮬레이션(구현)' 카테고리의 다른 글

[백준 12759] 틱!택!토!  (0) 2020.01.08
[백준 2578] 빙고  (0) 2020.01.06
[백준 1526] 가장 큰 금민수  (0) 2020.01.06
[백준 2303] 숫자 게임  (0) 2020.01.03
[백준 10163] 색종이  (0) 2020.01.03

+ Recent posts