Algorithm/λ¬Έμ œν’€μ΄

[λ°±μ€€] 1268번 - μž„μ‹œ 반μž₯ μ •ν•˜κΈ° (C++)

moaoh 2023. 9. 14. 23:56

 

1268번: μž„μ‹œ 반μž₯ μ •ν•˜κΈ°

μ˜€λ―Όμ‹ μ„ μƒλ‹˜μ€ μ˜¬ν•΄ ν˜•νƒμ΄ˆλ“±ν•™κ΅ 6ν•™λ…„ 1반 λ‹΄μž„μ„ 맑게 λ˜μ—ˆλ‹€. μ˜€λ―Όμ‹ μ„ μƒλ‹˜μ€ μš°μ„  μž„μ‹œλ‘œ 반μž₯을 μ •ν•˜κ³  학생듀이 μ„œλ‘œ μΉœμˆ™ν•΄μ§„ 후에 μ •μ‹μœΌλ‘œ μ„ κ±°λ₯Ό 톡해 반μž₯을 μ„ μΆœν•˜λ €κ³  ν•œλ‹€.

www.acmicpc.net

문제

μ˜€λ―Όμ‹ μ„ μƒλ‹˜μ€ μ˜¬ν•΄ ν˜•νƒμ΄ˆλ“±ν•™κ΅ 6ν•™λ…„ 1반 λ‹΄μž„μ„ 맑게 λ˜μ—ˆλ‹€. μ˜€λ―Όμ‹ μ„ μƒλ‹˜μ€ μš°μ„  μž„μ‹œλ‘œ 반μž₯을 μ •ν•˜κ³  학생듀이 μ„œλ‘œ μΉœμˆ™ν•΄μ§„ 후에 μ •μ‹μœΌλ‘œ μ„ κ±°λ₯Ό 톡해 반μž₯을 μ„ μΆœν•˜λ €κ³  ν•œλ‹€. κ·ΈλŠ” 자기반 학생 μ€‘μ—μ„œ 1ν•™λ…„λΆ€ν„° 5ν•™λ…„κΉŒμ§€ μ§€λ‚΄μ˜€λ©΄μ„œ ν•œλ²ˆμ΄λΌλ„ 같은 λ°˜μ΄μ—ˆλ˜ μ‚¬λžŒμ΄ κ°€μž₯ λ§Žμ€ 학생을 μž„μ‹œ 반μž₯으둜 μ •ν•˜λ € ν•œλ‹€.

κ·Έλž˜μ„œ μ˜€λ―Όμ‹ μ„ μƒλ‹˜μ€ 각 학생듀이 1ν•™λ…„λΆ€ν„° 5ν•™λ…„κΉŒμ§€ λͺ‡ λ°˜μ— μ†ν–ˆμ—ˆλŠ”μ§€λ₯Ό λ‚˜νƒ€λ‚΄λŠ” ν‘œλ₯Ό λ§Œλ“€μ—ˆλ‹€. 예λ₯Ό λ“€μ–΄ 학생 μˆ˜κ°€ 5λͺ…일 λ•Œμ˜ ν‘œλ₯Ό μ‚΄νŽ΄λ³΄μž.

  1ν•™λ…„ 2ν•™λ…„ 3ν•™λ…„ 4ν•™λ…„ 5ν•™λ…„
1번 학생 2 3 1 7 3
2번 학생 4 1 9 6 8
3번 학생 5 5 2 4 4
4번 학생 6 5 2 6 7
5번 학생 8 4 2 2 2

μœ„ κ²½μš°μ— 4번 학생을 보면 3번 학생과 2ν•™λ…„ λ•Œ 같은 λ°˜μ΄μ—ˆκ³ , 3번 학생 및 5번 학생과 3ν•™λ…„ λ•Œ 같은 λ°˜μ΄μ—ˆμœΌλ©°, 2번 ν•™μƒκ³ΌλŠ” 4ν•™λ…„ λ•Œ 같은 λ°˜μ΄μ—ˆμŒμ„ μ•Œ 수 μžˆλ‹€. κ·ΈλŸ¬λ―€λ‘œ 이 ν•™κΈ‰μ—μ„œ 4번 학생과 ν•œλ²ˆμ΄λΌλ„ 같은 λ°˜μ΄μ—ˆλ˜ μ‚¬λžŒμ€ 2번 학생, 3번 학생과 5번 ν•™μƒμœΌλ‘œ λͺ¨λ‘ 3λͺ…이닀. 이 μ˜ˆμ—μ„œ 4번 학생이 전체 학생 μ€‘μ—μ„œ 같은 λ°˜μ΄μ—ˆλ˜ 학생 μˆ˜κ°€ 제일 λ§ŽμœΌλ―€λ‘œ μž„μ‹œ 반μž₯이 λœλ‹€.

각 학생듀이 1ν•™λ…„λΆ€ν„° 5ν•™λ…„κΉŒμ§€ μ†ν–ˆλ˜ 반이 μ£Όμ–΄μ§ˆ λ•Œ, μž„μ‹œ 반μž₯을 μ •ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

 

μž…λ ₯

첫째 μ€„μ—λŠ” 반의 학생 수λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μ •μˆ˜κ°€ μ£Όμ–΄μ§„λ‹€. 학생 μˆ˜λŠ” 3 이상 1000 μ΄ν•˜μ΄λ‹€. λ‘˜μ§Έ μ€„λΆ€ν„°λŠ” 1번 학생뢀터 μ°¨λ‘€λŒ€λ‘œ 각 μ€„λ§ˆλ‹€ 1ν•™λ…„λΆ€ν„° 5ν•™λ…„κΉŒμ§€ λͺ‡ λ°˜μ— μ†ν–ˆμ—ˆλŠ”μ§€λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 5개의 μ •μˆ˜κ°€ 빈칸 ν•˜λ‚˜λ₯Ό 사이에 두고 μ£Όμ–΄μ§„λ‹€. μ£Όμ–΄μ§€λŠ” μ •μˆ˜λŠ” λͺ¨λ‘ 1 이상 9 μ΄ν•˜μ˜ μ •μˆ˜μ΄λ‹€.

 

좜λ ₯

첫 쀄에 μž„μ‹œ 반μž₯으둜 μ •ν•΄μ§„ ν•™μƒμ˜ 번호λ₯Ό 좜λ ₯ν•œλ‹€. 단, μž„μ‹œ 반μž₯이 될 수 μžˆλŠ” 학생이 μ—¬λŸ¬ λͺ…인 κ²½μš°μ—λŠ” κ·Έ 쀑 κ°€μž₯ μž‘μ€ 번호만 좜λ ₯ν•œλ‹€.

 

풀이과정

문제의 μ΄ν•΄μžμ²΄λŠ” μ‰½κ²Œ ν•  수 μžˆμ—ˆλŠ”λ° λ¬Έμ œμ— λŒ€ν•œ 접근이 κΉŒλ‹€λ‘œμ› λ˜ κ±° κ°™λ‹€.

[ν•™λ…„][반][번호] ν˜•μ‹μœΌλ‘œ κ°’μ˜ 기쀀을 μ„Έμ›Œ 문제λ₯Ό ν•΄κ²°ν•˜μ˜€λ‹€.

 

 

code

#include <iostream>
#include <vector>

int check[1001][1001];

// [ν•™λ…„][반][번호]
int		main(void)
{
	int n, student, temp, count, max, number;
	std::vector <int> vec[6][10];

	std::cin >> n;
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= 5; j++) {
			std::cin >> student;
			vec[j][student].push_back(i);
		}
	}
	for (int i = 1; i <= 5; i++) {
		// std::cout << i << " ν•™λ…„" << "\n";
		for (int j = 1; j <= 9; j++) {
			// std::cout << j << " 반 : " << " ";
			for (int k = 0; k < vec[i][j].size(); k++) {
				temp = vec[i][j][k];
				// std::cout << temp << " ";
				for (int l = 0; l < vec[i][j].size(); l++) {
					check[temp][vec[i][j][l]] = 1;
				}
			}
			// std::cout << "\n";
		}
		// std::cout << "\n";
	}
	max = -1;
	number = 0;
	for(int i = 1; i <= n; i++) {
		count = 0;
		for (int j = 1; j <= n; j++) {
			if (check[i][j])
				count++;
		}
		if (max < count) {
			max = count;
			number = i;
		}
	}

	std::cout << number;
}

 

ν›„κΈ°

λ‘œμ§μ„ κ΅¬μ„±ν•˜λŠ”κ²Œ κΉŒλ‹€λ‘œμ› λ˜ λ¬Έμ œμ˜€λ‹€