문제를 이해하고 있다면 바로 풀이를 보면 됨
전체 코드로 바로 넘어가도 됨
마음대로 번역해서 오역이 있을 수 있음
ACM-ICPC 월드 파이널에 참여하는 사람들이 있다. 각각의 사람들은 주제에 능숙할 수도 있다. 참가자가 알고 있는 주제 목록이 이진 문자열로 주어졌을 때, 2인으로 구성된 팀이 알 수 있는 최대 주제 수를 구해라. 각 주제는 이진 문자열로 되어 있고, '1'은 알고 있는 주제를 의미하고, '0'은 모르는 주제를 의미한다. 또한 가장 많이 알고 있는 주제 수를 가지고 있는 팀의 수를 구해라. 두 개의 요소를 가진 정수형 배열을 반환해라. 첫 번째는 알고 있는 주제의 최대 수, 두 번째는 최대 주제 수를 가진 팀의 수이다.
topics = ['10101', '11110', '00010']
구성할 수 있는 모든 팀이다.
Members | Subjects |
---|---|
(1, 2) | [1, 2, 3, 4, 5] |
(1, 3) | [1, 3, 4, 5] |
(2, 3) | [1, 2, 3, 4] |
이 경우, 첫 번째 팀은 5개의 주제 모두 알 수 있다. 첫 번째 팀은 가장 많은 주제를 알고 있는 유일한 팀이다. 그래서 [5, 1]을 반환한다.
acmTeam 함수를 완성해라.
acmTeam 함수는 아래와 같은 매개변수를 가지고 있다.
지역변수와 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;
}