이번 문제를 해결하기 위한 방법은 선수들의 현재 순위를 관리하는 것이다.
이를 위해 HashMap을 사용하여 각 선수의 이름과 현재 순위를 key-value 쌍으로 저장한다.
해설진이 선수 이름을 부를 때마다 해당 선수는 바로 앞 선수를 추월한 것으로 간주하여 순위를 업데이트한다.
1. 초기 순위 설정 : 선수들의 초기 순위를 HashMap에 저장한다. 이 때 선수들의 이름을 key로,
현재 등수를 value(index) 값으로 사용한다.
Map<String, Integer> runners = new HashMap<>();
for(int i = 0; i < players.length; i++) {
runners.put(players[i], i);
}
2. 추월 상황 처리 : 해설진이 부른 이름을 기반으로 순위 변경 로직을 실행한다.
호출된 선수는 바로 앞의 선수와 순위가 바뀌며, 이는 배열과 HashMap에서 모두 업데이트된다.
for(int i = 0; i < callings.length; i++) {
String call = callings[i];
int now = runners.get(call);
String prev = answer[now - 1];
// HashMap에서 순위 업데이트
runners.replace(call, now - 1);
runners.replace(prev, now);
// 배열에서 선수 위치 교환
String temp = answer[now];
answer[now] = answer[now - 1];
answer[now - 1] = temp;
}
핵심 포인트로는
- HashMap을 사용하여 선수들의 순위를 빠르게 조회하고 업데이트 하는 방법을 통해, 각 추월 상황을 효과적으로 관리하는 것이다.
전체 코드
import java.util.*;
class Solution {
public String[] solution(String[] players, String[] callings) {
String[] answer = players;
Map<String, Integer> runners = new HashMap<>();
for(int i = 0; i < players.length; i++) {
runners.put(players[i], i);
}
for(int i = 0; i < callings.length; i++) {
String call = callings[i];
int now = runners.get(call);
String prev = answer[now - 1];
runners.replace(call, now - 1);
runners.replace(prev, now);
String temp = answer[now];
answer[now] = answer[now - 1];
answer[now - 1] = temp;
}
return answer;
}
}