[TC1101] [그리디] 모험가 길드
✏️ 𝗔𝗹𝗴𝗼𝗿𝗶𝘁𝗵𝗺/이것이 코딩 테스트다

[TC1101] [그리디] 모험가 길드

🚩 문제 설명

한 마을에 모험가가 N명 있습니다.
모험가 길드에서는 N명의 모험가를 대상으로 '공포도'를 측정했는데,
'공포도'가 높은 모험가는 쉽게 공포를 느껴 위험 상황에서 제대로 대처할 능력이 떨어집니다.
모험가 길드장인 동빈이는 모험가 그룹을 안전하게 구성하고자 공포도가 X인 모험가는
반드시 X명 이상으로 구성한 모험가 그룹에 참여해야 여행을 떠날 수 있도록 규정했습니다.
동빈이는 최대 몇 개의 모험가 그룹을 만들 수 있는지 궁금합니다.
동빈이를 위해 N명의 모험가에 대한 정보가 주어졌을 때,
여행을 떠날 수 있는 그룹 수의 최댓값을 구하는 프로그램을 작성하세요.
⏱️ 시간 복잡도
▪ O(N^2)

◾ 모험을 떠날 수 있는 그룹의 최대를 반환해야합니다.

 

 

 


 

 

 

입출력

변수 설명
N: 모험가의 수
arr: 각 모험가의 공포도
return ➡️ 만들 수 있는 최대의 그룹 수

✔️ 예제 1

5
2 3 1 2 2
2

 

✔️ 예제 2

5
4 2 2 3 1
2

 

 


 

 

 

📑 문제 풀이

with 자바 (Java)
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;



// 그리디 
public class TC_모험가길드 {
	static int N, ans = 1;
	static int[] arr;


	public static void main(String[] args) throws Exception {
		System.setIn(new FileInputStream("input.txt"));
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		// 입력 받기
		N = Integer.parseInt(br.readLine());
		System.out.println(N);

		// 배열 입력 받기
		arr = new int[N];
		StringTokenizer st = new StringTokenizer(br.readLine());
		for (int i = 0; i < N; i++) {
			arr[i] = -Integer.parseInt(st.nextToken());
		}

		// 배열 내림차순 정렬하기
		Arrays.sort(arr);
		for (int i = 0; i < N; i++) {
			arr[i] = -arr[i];
		}

		System.out.println(Arrays.toString(arr));

		int max = Integer.MIN_VALUE;
		int ans = 0;

		for (int i = 0; i < N; i++) {
			int cur = arr[i]; // 현재 비교 대상
			int cnt = 0; // 비교 대상 만큼 카운팅 되면 하나의 그룹으로

			for (int j = i; j < N; j++) {
				// 카운팅이 완성되면 하나의 그룹으로 치기
				if (cnt == cur) {
					cur = arr[j]; // 다음 그룹을 만들기 위해 cur 변경
					ans++; // 각 단계마다의 max 값 저장하기 위하여
					cnt = 0; // 카운트 초기화
				}

				if (cur >= arr[j]) cnt++;

			}

			// 최댓값 비교
			max = Math.max(max, cnt);

		}

		System.out.println(max);

	}
}

💬 Point

➡️  정렬
➡️  cur pointer 를 사용하여 현재의 값과 비교한다.

◾ 먼저 정렬을 해서 내림차순을 합니다.

◾ 현재 제일 큰 숫자를 cur 에 넣습니다. 그렇게 되면 cur 보다 작은 숫자들은 카운팅이 될 수 있습니다.

◾ 만약 카운팅을 해서 cur 만큼 차면 그 수열들은 하나의 그룹이 될 수 있습니다.

 

 

 

 

 

 

 

 

 

# 이것이 코딩 테스트다 모험가 길드 # 이코테 모험가 길드 java


 

728x90