카테고리 없음

[알고리즘] 백준 9017 크로스 컨트리 c++ 예외처리

때려쳐아니때려치지마 2024. 10. 26. 19:54
반응형

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

 

 

풀이 과정

1. 인원수를 산정 - 6명이 되는 팀만 남김

2. 해당 팀의 점수 목록을 저장

3. 정리된 팀을 foreach 돌려서 작은 점수인 팀을 승리로 결정

// bj9017.cpp : 이 파일에는 'main' 함수가 포함됩니다. 거기서 프로그램 실행이 시작되고 종료됩니다.
//

#include <iostream>
#include <vector>
#include <map>

using namespace std;

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

	for (int i = 0; i < case_num; i++)
	{
		int num, team_idx;
		cin >> num;

		// 팀별 인원수 산정
		vector<int> teams;
		map <int, int> each_team_size;
		for (int j = 0; j < num; j++)
		{
			cin >> team_idx;
			teams.push_back(team_idx);
			each_team_size[team_idx]++;
		}

		// 인원수 비교 후 점수 리스트 축적
		int rank = 1;
		map <int, vector<int>> each_team_rank;
		for (int k = 0; k < num; k++)
		{
			if (each_team_size[teams[k]] == 6) 
			{
				each_team_rank[teams[k]].push_back(rank);
			}
			else 
			{
				continue;
			}
			rank++;
		}

		// 승자 비교 - 작은수가 승리
		int winner = -1;
		int winner_score = 2147483647;
		for (const auto& team_pair : each_team_rank)
		{
			int cur_score = team_pair.second[0] + team_pair.second[1] + team_pair.second[2] + team_pair.second[3];

			if (cur_score < winner_score) {
				winner = team_pair.first;
				winner_score = cur_score;
			}
			else if (cur_score == winner_score) {
				if (team_pair.second[4] < each_team_rank[winner][4]) {
					winner = team_pair.first;
					winner_score = cur_score;
				}
			}
		}

		// 승자 출력
		cout << winner << "\n";
	}
}

 

문제됐던 부분

int winner_score = 2147483647;

승자 비교 부분에서 현재 점수가 winner_score보다 작으면 승자로 체크하는데

MAX를 100,000정도면 여유있다고 생각하여 초기값을 잡았는데 4%에서 틀림처리됨

int의 맥스로 점수 산정하니 맞았다.

 

이부분을 개선해서 점수비교가 아니라 sort로 풀어봐야될것같다.

반응형