코딩테스트/프로그래머스
[프로그래머스] 달리기 경주 (Java)
개발자마이
2023. 4. 11. 23:39
반응형
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
접근 방식
달리기를 하며 이름이 불리는 선수와 그 선수의 바로 앞에 있는 선수의 순위(위치)를 바꾸어주면 되는 문제이다. 범위를 벗어나는(1등 선수) calling 은 없으므로 별도의 순위변경에 대한 예외처리는 필요없었다. 다만 복잡도를 줄이기 위해 이중 반복문을 통한 탐색이 아닌 해시맵을 활용한 탐색 및 등수의 변경으로 로직을 만들어야했다. 인풋값이 각각 50,000과 100,000이였기 때문이다.
로직 설명
- 선수들의 순위를 이름으로 바로 접근할 수 있도록 map을 선언하여 이름과 순위를 key, value로 넣어준다.
- calling배열을 탐색하며:
1) 현재 불리는 선수의 순위(인덱스)를 가져온다(이 순위로 player 배열에서 현재 선수와, 앞 선수에 접근할 수 있다).
2) map에서 두 선수의 순위를 바꿔준다.
3) player 배열에서 두 선수의 위치를 바꿔준다.
import java.util.*;
class Solution {
public String[] solution(String[] players, String[] callings) {
Map<String, Integer> pMap = new HashMap<String, Integer>();
for(int i = 0; i < players.length; i++){
pMap.put(players[i], i);
}
for(String name : callings){
//change ranks
int idx = pMap.get(name);
pMap.put(players[idx], idx - 1);
pMap.put(players[idx - 1], pMap.get(players[idx - 1]) + 1);
//swap players
String temp = players[idx];
players[idx] = players[idx - 1];
players[idx - 1] = temp;
}
return players;
}
}
반응형