뜸부기와 공작새

[해커랭크 (Hacker Rank)] - Climbing the Leaderboard 본문

프로그래밍 문제

[해커랭크 (Hacker Rank)] - Climbing the Leaderboard

성씨 2020. 1. 28. 22:24

[사이트 링크]

https://www.hackerrank.com/challenges/climbing-the-leaderboard/problem

 

Climbing the Leaderboard | HackerRank

Help Alice track her progress toward the top of the leaderboard!

www.hackerrank.com

 

[함수부 소스코드 (C++ 구현)]


typedef struct {
	int rank;
	int score;
} score_rank_t;

// Complete the climbingLeaderboard function below.
vector<int> climbingLeaderboard(vector<int> scores, vector<int> alice) {
	int rank = 1;
	score_rank_t sr;
	vector<score_rank_t> score_rank;
	vector<int> total_score;

	/* score_rank 계산 */
	vector<int>::iterator its;		/* iteration of Scores */
	for (its = scores.begin(); its != scores.end(); its++) {
		sr.score = (*its);

		if (its == scores.begin()) { 
			sr.rank = rank; 
		}
		else if ((*its) == *(its - 1)) {
			sr.rank = rank;
		}
		else {
			sr.rank = ++rank;
		}

		score_rank.push_back(sr);
	}

	/* 입력한 Score Rank 벡터를 오름차순으로 변경하여 Alice값 입력 차순과 동일하게 맞춘다 */
	reverse(score_rank.begin(), score_rank.end());

	vector<int>::iterator ita;					/* iteration of Alice */
	vector<score_rank_t>::iterator itsc;		/* iteration of Scores, Rank */
	itsc = score_rank.begin();
	for (ita = alice.begin(); ita != alice.end(); ita++) {

		if (itsc != score_rank.begin()) { itsc--; }

		for (; itsc != score_rank.end(); itsc++) {
			if ((*ita) < (*itsc).score) {
				total_score.push_back((*itsc).rank + 1);
				break;
			}
			else if (itsc + 1 == score_rank.end()) {
				total_score.push_back((*itsc).rank);
			}
		}
	}

	return total_score;
}

 

[내용]

  • 점수, 랭크 정보를 함께 저장하여 관리할 구조체를 생성함
  • 생성한 구조체 타입의 vector를 생성하여 입력받은 Score를 담고 이에 해당하는 랭크값을 계산하여 입력
    (해당 자료구조를 vector가 아닌 map 자료구조를 이용했어도 될 뻔했다...)
  • Alice가 오름차순으로 값을 입력하니 Alice 입력데이터의 순차와 동일하게 맞추기 위해
    score_rank vector reverse() 수행
  • Score입력값, Rank값 Alice입력값 세 값 모두 순차가 동일하니
    Score 입력vector는 Alice 입력값마다 begin() to end() loop 수행하는 것이 아닌
    이전 Alice값이 찾은 Rank의 위치부터 다시 시작하도록 구현할 수 있음
    (ex Alice[2]의 값이 Score[15]의 위치에서 Rank값 4를 얻었으면 Alice[3]값은 Score[0]부터 시작하는 것이 아니라
    Score[15]부터 시작하여 수행시간을 줄임)
  • Alice의 랭킹을 저장하는 벡터를 출력하고 종료
  • 지금 코드를 다시보니 가독성이 너무 떨어진다...