마이의 개발 블로그

[프로그래머스] 달리기 경주 (Java) 본문

코딩테스트/프로그래머스

[프로그래머스] 달리기 경주 (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;
    }
}

 

반응형
Comments