포스트

5766 할아버지는 유명해!

간단한 구현문제

Direct Index Table과 두번째로 큰 값 찾기

1. 문제


간단 설명

문제가 번역체라 이해하는데 시간이 좀 걸렸다

매주마다 주어지는 랭킹정보를 보고, 2등 선수가 누구인지 찾는 문제

2. 문제 분석


필요변수

각 선수는 1~10000까지의 정수(선수 번호)로 식별. player[10001] 배열에 저장

몇주차 정보가 주어지는지 저장할 N

주차별 랭킹에 든 선수가 몇명인지 저장할 M

그 외에도 1등, 2등을 판별할 변수들과

2등이 여러명일 경우 이를 오름차순으로 정렬할 벡터 res

주의점

  • 매주 랭킹에 선수의 이름이 오를 때마다 선수의 포인트가 1포인트씩 오른다고함

    주어지는 숫자자의 순서는 순위가 아니라 다같이 1점씩 받는것

  • 각 테스트케이스별로 리더보드가 초기화 된다

  • 2등을 구하는 방법에 주의

  • 입력값이 많으니 cin, cout 사용시 주의할 것

알고리즘

1
2
3
4
5
6
7
8
9
10
11
1. 테스트케이스를 입력받는다. 
2. N과 M이 0이라면 종료한다
    - 아니라면, 스코어보드를 초기화한다
3. N주차 스코어 정보를 입력받는다
    3-1. M개의 선수들의 정보를 입력받는다.
    - 선수 번호가 나온다면, 그 선수의 인덱스에 +1 을 해준다
4. 2등의 점수를 구한다
    4-1. 현재 1등 점수보다 크다면, 1등 점수에 현재 점수를 넣고, 들고있던 점수를 2등에게 넘겨준다
    4-2. 1등보다는 작지만, 2등보다는 크다면, 2등 점수를 갱신한다
5. 2등의 점수와 같은 선수들을 res 벡터에 넣는다
6. res 벡터를 출력한다

3. 소스코드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <iostream>
#include <vector>
#include <algorithm>
#include <string.h>

using namespace std;

#define MAX 10001

int player[MAX] = { 0 };

int main() {
	freopen_s(new FILE*, "input.txt", "r", stdin);
	int N, M;

	while (1) {
		scanf("%d %d", &N, &M);
		if (N == 0 && M == 0) break;
		memset(player, 0, sizeof(player));
	
		for (int i = 0; i < N; i++) {
			// 1. N주차 스코어 정보 입력받기
			for (int j = 0; j < M; j++) {
				int tmp = 0;
				scanf("%d", &tmp);
				player[tmp] += 1;
			}

		}	

		// 2. 2등 구하기
		int first = 0, second = 0;
		for (int i = 0; i < MAX; i++) {
			// 현재 1등보다 큰값이 나오면 1등값을 2등에게 주고, 1등값을 받아옴
			if (first < player[i]) {
				second = first;
				first = player[i];
			}
			// 1등보다는 작은데, 1등과 같지 않고 2등보다 크다면 그 값을 2등에 넣는다
			else if (second < player[i] && player[i] != first) {
				second = player[i];
			}
		}

		// 2등 값과 같은 선소들을 찾아 벡터에 넣기

		vector<int> res;
		for (int i = 0; i < MAX; i++) {
			if (second == player[i]) {
				res.push_back(i);
			}
		}

		for (int e : res) {
			cout << e << " ";
		}
		cout << endl;
	}

	return 0;
}

두번째로 큰 값을 구하는 방법이 깔끔하지 못해서 찾아봤다

가장 큰 값을 배열에서 삭제하고 다시 순회하는 방법을 사용했는데, 개선한 방법이 더 깔끔한것 같다

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.