알고리즘/Lv1. 프로그래머스

달리기 경주

signal시노 2023. 7. 2. 17:01
 

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

import java.util.Arrays;
class Solution {
    public String[] solution(String[] players, String[] callings) {
        
        for(int i=0;i<callings.length;i++){
            for(int j=0;j<players.length;j++){
                if(callings[i].equals(players[j])){
                    String pre=players[j-1];
                    players[j-1]=players[j];
                    players[j]=pre;
                    break;
                }
            }
        }
        return players;
    }
}

단순히 이중 for문이므로 호출된 선수가 꼴지라면 배열 끝까지 돌아야하므로 비효율적이고 시간초과가 났습니다.

map의 키값을 활용하여 찾아낸다면 훨씬 효율적일 것 입니다.

import java.util.*;
class Solution {
    public String[] solution(String[] players, String[] callings) {
        Map<String,Integer> playersMap=new HashMap<>();
        //선수와 등수 map에 put
        for(int i=0;i<players.length;i++){
            playersMap.put(players[i],i);
        }
        
        for(String call : callings){
            //호출된 선수의 등수
            int callingPlayer=playersMap.get(call);
            //앞에 있는 선수
            String pre=players[callingPlayer-1];
            
            players[callingPlayer-1]=players[callingPlayer];
            players[callingPlayer]=pre;
            
            playersMap.put(call,callingPlayer-1);
            playersMap.put(pre,callingPlayer);
        }
        return players;
    }
}

결과는 성공

 

 

 

'알고리즘 > Lv1. 프로그래머스' 카테고리의 다른 글

두 개 뽑아서 더하기  (0) 2023.07.11
k번째수  (0) 2023.07.11
숫자 문자열과 영단어  (0) 2023.07.11
1차 비밀지도  (0) 2023.07.07
추억 점수  (0) 2023.07.04