λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Algorithm

[λ°±μ€€] 1268번: μž„μ‹œ 반μž₯ μ •ν•˜κΈ°(κ΅¬ν˜„)

by 주발2 2020. 2. 24.
λ°˜μ‘ν˜•

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

 

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

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

www.acmicpc.net

μ½”λ“œ

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.Set;
import java.util.StringTokenizer;

public class Main {

	public static void main(String[] args) throws IOException {
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		
		/** 1 **/
		int n = Integer.parseInt(bf.readLine());// 학생 수
		int[][] arr = new int[n][5];		// ν–‰: ν•™μƒμˆ˜, μ—΄: 1~5ν•™λ…„
		int[] sameClassRoom = new int[n];	// 학생 별 같은 λ°˜μ΄μ—ˆλ˜ 학생 수 
		int maxStudent = 0;			// 같은 λ°˜μ΄μ—ˆλ˜ 학생 수 μ΅œλŒ“κ°’
		int answer = 0;
		
		/** 2 **/
		for(int i=0; i<n; i++) {	// 학생 μˆ˜λ³„λ‘œ 1ν•™λ…„ ~ 5ν•™λ…„κΉŒμ§€ λͺ‡ λ°˜μ— μ†ν–ˆμ—ˆλŠ”μ§€ μž…λ ₯
			st = new StringTokenizer(bf.readLine());
			for(int j=0; j<5; j++) {
				arr[i][j] = Integer.parseInt(st.nextToken());
			}
		}
		
		/** 3 **/
		for(int i=0; i<n; i++) {
			Set<Integer> sameClass = new HashSet<>(); 

			for(int j=0; j<5; j++) {
				for(int k=0; k<n; k++) {
					if(arr[i][j] == arr[k][j] && k != i) {
						sameClass.add(k);
					}
				}
			}
			
			if(maxStudent < sameClass.size()) {
				maxStudent = sameClass.size();
				answer = i;
			}
		}
		
		
//		/** 4 **/
//		for(int i=0; i<sameClassRoom.length; i++) {
//			if(sameClassRoom[i] > maxStudent)
//				maxStudent = sameClassRoom[i];
//		}
//
//		/** 5 **/
//		for(int i=0; i<sameClassRoom.length; i++) {
//			if(sameClassRoom[i] == maxStudent) {
//				System.out.println(i+1);
//				break;
//			}
//		}
		System.out.println(answer+1);
		
		bf.close();
	}

}

풀이

κ΅¬ν˜„ 문제, λ¬Έμ œμ—μ„œ 주어진 λ°©μ‹λŒ€λ‘œ μ™„μ „νƒμƒ‰μœΌλ‘œ ν•΄κ²°ν•˜λ €κ³  ν–ˆλ‹€.

Input 학생 μˆ˜λŠ” μ΅œλŒ€ 1000이고, 5ν•™λ…„μ΄μ–΄μ„œ O(5*1000*1000) μ΄μ–΄μ„œ κ°€λŠ₯ν•˜λ‹€κ³  νŒλ‹¨ν•˜κ³  μ ‘κ·Όν–ˆλ‹€.
1번 ~ n번의 각 ν•™μƒλ³„λ‘œ λ‹€λ₯Έ 학생과 λͺ‡λ²ˆ κ°™μ€λ°˜μ΄ λœμ§€ ν•˜λ‚˜ν•˜λ‚˜ λ‹€ μ°Ύμ•„μ„œ 비ꡐλ₯Ό ν•΄μ£Όμ—ˆλ‹€.

문제의 μ˜ˆμ‹œλ₯Ό 톡해 보면,,

1번 학생이 1ν•™λ…„, 2ν•™λ…„, 3ν•™λ…„, 4ν•™λ…„, 5ν•™λ…„λ™μ•ˆ λ‹€λ₯Έ 학생과 총 λͺ‡λ²ˆ κ°™μ€λ°˜μ΄ λœμ§€ μ²΄ν¬ν•΄μ„œ μΉ΄μš΄νŠΈν•΄μ£Όμ—ˆλ‹€.

1번 학생은 1ν•™λ…„~5ν•™λ…„ μ „λΆ€ λ‹€λ₯Έ 학생과 κ°™μ€λ°˜μ΄ 된 적이 ν•œλ²ˆλ„ μ—†μœΌλ―€λ‘œ μΉ΄μš΄νŠΈλŠ” 0이닀,

μœ„μ™€κ°™μ΄ 해보면 2번 학생은 4ν•™λ…„λ•Œ 4번 학생과 1번

3번 학생은 3번, 4번 학생은 4번, 5번 학생은 2번이 λ‚˜μ˜¨λ‹€.

ν•˜μ§€λ§Œ μœ„μ™€ 같이 μ ‘κ·Όν–ˆμ„λ•Œ μ€‘λ³΅μ΄λΌλŠ” 문제점이 λ°œμƒν•œλ‹€. 이 μ€‘λ³΅λ•Œλ¬Έμ— ν—€λ§ΈλŠ”λ°..

 

4

3 5 1 5 5

4 4 3 5 1

1 2 3 2 2

1 3 3 2 2

 

λ§Œμ•½ μœ„μ™€ 같이 μ£Όμ–΄μ‘Œμ„λ•Œ, 3λ²ˆμΉœκ΅¬λŠ” 4λ²ˆμΉœκ΅¬μ™€ 4ν•™λ…„, 5학년에 λͺ¨λ‘ κ°™μ€λ°˜μ΄μ§€λ§Œ, 쀑볡이 λ˜λ―€λ‘œ +2κ°€ μ•„λ‹Œ +1을 ν•΄μ£Όμ–΄μ•Ό ν•œλ‹€. λ”°λΌμ„œ μœ„μ™€ 같은 μ˜ˆμ™Έκ°€ μžˆμ—ˆλ‹€.

κ·Έλž˜μ„œ Set - HashSet을 μ΄μš©ν•΄ 해결을 ν•΄μ£Όμ—ˆλŠ”λ°, νŠΉμ§•μ€ 쀑볡을 ν—ˆλ½ν•˜μ§€ μ•Šκ³  μˆœμ„œμ™€ 관계없이 μ •λ ¬λœλ‹€.

쀑볡을 ν—ˆλ½ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ μœ„μ™€κ°™μ€ 쀑볡을 방지할 수 μžˆλ‹€.

λ”°λΌμ„œ 같은 반이 된 경우, HashSet에 μΆ”κ°€ν•΄μ£Όκ³ ,(크기 +1) 학생 μˆ˜μ™€ 비ꡐ해쀀닀.

 

 

/** 1 **/

λ³€μˆ˜ μž…λ ₯

 

/** 2 **/

2차원 배열에 Input 값을 μ €μž₯ν•œλ‹€.

 

/** 3 **/

각 학생 λ³„λ‘œ λΉ„κ΅ν•˜λŠ” λ¬Έμž₯,

κ°€μž₯ λ°– forλ¬Έ(i=0; i<n; i++) 이 for문은, 비ꡐ할 λŒ€μƒμ΄ λ˜λŠ” 학생을 지λͺ©ν•  행이닀.

쀑간 forλ¬Έ(j=0; j<5; j++) 이 for문은, 비ꡐ할 λŒ€μƒμ˜ ν•™λ…„ λ³„λ‘œ 선택할 열이닀.

κ°€μž₯ μ•ˆ forλ¬Έ(k=0; k<n; k++) 이 for문은, μœ„ i,j의 학생과 ν•™λ…„λ³„λ‘œ λͺ¨λ“  학생을 νƒμƒ‰ν•˜λ©΄μ„œ 비ꡐ할 for문이닀.

 

1번 ν•™μƒμ˜ 경우둜 예λ₯Ό 듀어보면,

1번 학생: 1ν•™λ…„, 2ν•™λ…„, 3ν•™λ…„, 4ν•™λ…„, 5ν•™λ…„ λ™μ•ˆ

2번 ~ 5번 ν•™μƒμ˜ 1, 2, 3, 4, 5 ν•™λ…„κ³Ό 비ꡐλ₯Ό ν•΄μ•Όν•œλ‹€.

비ꡐλ₯Ό 톡해 같은 반일경우 -> HashSet에 add()λ₯Ό 톡해 μ‚¬μ΄μ¦ˆλ₯Ό +1 ν•œλ‹€.

 

λ°˜μ‘ν˜•

'Algorithm' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[λ°±μ€€] 11726번: 2xn 타일링(DP)  (0) 2020.02.25
[Codeforces] 1223A: CME  (0) 2020.02.25
[Codeforces] 1200A: Cards  (0) 2020.02.24
[Codeforces] 1186A: Vus the Cossack and a Contest  (0) 2020.02.23
[Codeforces] 959A: Mahmoud and Ehab and the even-odd game  (0) 2020.02.22

λŒ“κΈ€