[HackerRank] ACM ICPC Team

아르당·2023년 11월 24일
0

HackerRank

목록 보기
32/109
post-thumbnail

문제를 이해하고 있다면 바로 풀이를 보면 됨
전체 코드로 바로 넘어가도 됨
마음대로 번역해서 오역이 있을 수 있음

문제

ACM-ICPC 월드 파이널에 참여하는 사람들이 있다. 각각의 사람들은 주제에 능숙할 수도 있다. 참가자가 알고 있는 주제 목록이 이진 문자열로 주어졌을 때, 2인으로 구성된 팀이 알 수 있는 최대 주제 수를 구해라. 각 주제는 이진 문자열로 되어 있고, '1'은 알고 있는 주제를 의미하고, '0'은 모르는 주제를 의미한다. 또한 가장 많이 알고 있는 주제 수를 가지고 있는 팀의 수를 구해라. 두 개의 요소를 가진 정수형 배열을 반환해라. 첫 번째는 알고 있는 주제의 최대 수, 두 번째는 최대 주제 수를 가진 팀의 수이다.

Example

topics = ['10101', '11110', '00010']

구성할 수 있는 모든 팀이다.

MembersSubjects
(1, 2)[1, 2, 3, 4, 5]
(1, 3)[1, 3, 4, 5]
(2, 3)[1, 2, 3, 4]

이 경우, 첫 번째 팀은 5개의 주제 모두 알 수 있다. 첫 번째 팀은 가장 많은 주제를 알고 있는 유일한 팀이다. 그래서 [5, 1]을 반환한다.

Function Description

acmTeam 함수를 완성해라.
acmTeam 함수는 아래와 같은 매개변수를 가지고 있다.

  • String[n]: 이진 문자열로 구성된 배열

Return

  • int[2]: 가장 많이 알고 있는 주제 수와 그 팀의 수

Constraints

  • 2 <= n <= 500
  • 1 <= m <= 500

풀이

지역변수와 for문을 굉장히 많이 사용하는 문제이다.
먼저 최대 주제 수와 최대 주제 수를 알고 있는 팀을 담을 변수를 선언한다.

int max = 0;   // 최대 주제 수
int count = 0; // 팀 수

그리고 반복의 반복의 반복을 통해 최대 주제 수와 팀 수를 구한다.

for(int i = 0; i < topic.size() - 1; i++){
	String str1 = topic.get(i);

	for(int j = i + 1; j < topic.size(); j++){
		String str2 = topic.get(j);
		int strCount = 0; // 두 사람이 알고 있는 주제 수

		for(int idx = 0; idx < str1.length(); idx++){
        	// 해당 주제가 두 사람 중에 한 명이라도 알고 있다면
			if(str1.charAt(idx) == '1' || str2.charAt(idx) == '1'){
				strCount++;
			}
		}

		if(strCount > max){ // 최대 주제 수 갱신
			max = strCount;
			count = 1;
		}else if(strCount == max){ // 최대 주제 수의 팀이 같다면
			count++;
		}
	}
}

그리고 반환할 리스트를 선언하고, 순서대로 최대 주제 수와 그 팀의 수를 추가하고 반환한다.

List<Integer> result = new ArrayList<>();
        
result.add(max);
result.add(count);
        
return result;

전체 코드

public static List<Integer> acmTeam(List<String> topic) {
	int max = 0;
	int count = 0;

	for(int i = 0; i < topic.size() - 1; i++){
		String str1 = topic.get(i);

		for(int j = i + 1; j < topic.size(); j++){
			String str2 = topic.get(j);
			int strCount = 0;

			for(int idx = 0; idx < str1.length(); idx++){
				if(str1.charAt(idx) == '1' || str2.charAt(idx) == '1'){
					strCount++;
				}
			}

			if(strCount > max){
				max = strCount;
				count = 1;
			}else if(strCount == max){
				count++;
			}
		}
	}

	List<Integer> result = new ArrayList<>();

	result.add(max);
	result.add(count);

	return result;
}
profile
내 마음대로 코드 작성하는 세상

0개의 댓글