import java.util.Arrays;
import java.util.List;
class Solution {
public String solution(String[] table, String[] languages, int[] preference) {
String answer = "";
int total = -1;
for(String filed : table) {
List<String> rankList = Arrays.asList(filed.split(" "));
String title = rankList.get(0);
int sum = 0;
for(int i=0;i<languages.length;i++) {
String lang = languages[i];
int pref = preference[i];
if(filed.contains(lang)) {
int index = rankList.indexOf(lang);
if(index > 0) {sum += ((6-index)*pref);}
}
}
if(total == sum) {
answer = (answer.compareToIgnoreCase(title) > 0 ? title : answer);
total = (answer.compareToIgnoreCase(title) > 0 ? total : sum);
} else if(total<sum) {
answer = title;
total = sum;
}
}
return answer;
}
}
📝 해결
! 풀이 순서
1. 최종적으로 반환될 가장 높은 총합의 직업을 담는 변수 answer와
해당 직업의 점수 총합을 담는 변수 total을 생성한다.
2. 직업군을 차례대로 반복하는 for문을 작성한다.
3. split() 메서드로 공백을 활용하여 언어 선호도 순위를 배열로 저장한다.
4. 직업군의 이름 title과 점수 총합을 담을 sum 변수를 생성해준다.
5. 언어를 반복하며 직업군에 언어가 포함되어 있는지?
없다면 0점
있다면 index가 1일 때 점수는 5이고 index가 2일 때 점수는 4점이다.
여기서 index와 점수의 합은 6이라는 규칙이 존재하므로
6-index(직업군 언어 점수) x preference(언어 선호도)를 sum에 더해준다.
( 처음엔 index값에 따라 switch문을 사용했다 ㅎㅎ )
추가적으로 index가 음수로 나올 수 있으니 if문을 통해 조건에 부합하는지 확인한다.
6. 최종 점수 총합과 sum과 비교하여
같은 점수라면 compareToIgnoreCase()를 사용해 사전 순으로 먼저인 직업과 점수를 answer과 total에 대입한다.
sum이 더 높다면 answer과 total에 현재 직업군인 title과 방금 계산한 sum을 대입한다.
C수업 당시 들었던 최대값 구하는 알고리즘을 많이 반영하였다.
문제가 복잡해 보이지만 차근차근 정리하며 진행하니까 깔끔한 코드를 작성할 수 있었다.
📍 문제