프로그래머스

[프로그래머스] 달리기 경주 (JAVA)

코 밑 2024. 12. 28. 17:47
Contents

https://school.programmers.co.kr/learn/courses/30/lessons/178871

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

달리기 경주를 하는 중인데 선수가 앞선 선수를 추월할 때마다 심판이 추월한 선수의 이름을 불러준다

초기 위치의 선수 이름과 심판이 부른 선수 이름 배열이 매개변수로 주어지고,

최종 선수들의 위치를 배열로 반환하면 된다.

 

처음에는 추월해서 선수의 위치가 변경될 때마다 등수 조회를 했는데 이렇게 하면 너무 느려서 시간 초과가 나온다;;;

 

그래서 HashMap을 이용해서 선수명을 key, 등수를 value로 넣어놓고

선수의 이름이 나올 때마다 map에서 get을 이용해 등수를 가져온다.

이러면 등수 조회를 이중 for문을 사용하지 않아도 돼서 속도가 향상된다

가져온 등수를 이용해 앞선 선수와 배열에서 이름을 바꾸고 난 뒤에는

map도 위치를 바꿔 최신화해준다. 그래야 다음번에도 등수를 알 수 있으니까

 

// 프로그래머스 달리기 경주
// 선수를 추월할 때마다 이름을 부름
// 일반 배열로 등수 조회를 하면 너무 느림 죄다 for문 돌려야하니까
// map으로 해서 선수명(String), 등수(int) 이렇게 해놓고
// 등수 조회를 map으로 하고 바꾸는 거는 일반 배열을 변경
class Solution {
    public String[] solution(String[] players, String[] callings) {
        // 일반 배열을 map으로 전환
        Map<String, Integer> pmap = new HashMap<>();
        for (int i = 0; i < players.length; i++) {
            pmap.put(players[i], i);
        }

        // 이름 불림
        for (String c : callings) {
            // map 이용해 부른 선수의 등수 조회
            int tmprank = pmap.get(c);
            // 부른 선수의 앞 등수의 선수명을 가져옴
            String tmpname = players[tmprank - 1];

            // 선수 교체
            players[tmprank - 1] = players[tmprank];
            players[tmprank] = tmpname;
            // map 최신화
            pmap.put(players[tmprank - 1], tmprank - 1);
            pmap.put(players[tmprank], tmprank);
        }
        return players;
    }
}

 

1등~