프로그래머스 코딩테스트 (달리기경주)

최주영·2023년 8월 29일
0

프로그래머스

목록 보기
1/2

✅ 난이도 : LEVEL 1

✅ 문제

✅ 풀이 방법
처음에 배열을 복사하는 방법에 대해서 헷갈렸다

  • 내가 처음에 푼 답
    이 방식으로 문제를 풀었을 때, 시간초과 즉 시간복잡도의 오류로 문제통과에 할 수 없었다
    -> 그래서 Map을 사용하여 해결하였다
class Solution {
    public String[] solution(String[] players, String[] callings) {
        
        String[] answer = players;
        
        for(int i=0; i<players.length; i++){
            answer[i] = players[i];
        }
        
        for(int i=0; i<callings.length; i++){
            for(int j=0; j<answer.length; j++){
                if(answer[j].equals(callings[i])){
                	answer[j] = answer[j-1]; 
                    answer[j-1] = callings[i]; 
                    break;
                }                 
            }
        }
        
        return answer;
    }
}
  • 최종 풀이
import java.util.HashMap;
import java.util.Map;

class Solution {
    public String[] solution(String[] players, String[] callings) {
        
        
        String[] answer = players; // 배열복사로 입력받은 선수명단을 복사
       
		Map<String,Integer> mapName = new HashMap<>(); 
        // key -> String, value -> int 로 map 생성
		for(int k=0; k<answer.length; k++) {
			mapName.put(answer[k],k); // 명단 이름을 key로, 그에 해당하는 index값을 값으로 둔다
		}
        
        for(int i=0; i<callings.length; i++){
        	int index = mapName.get(callings[i]); // 호명한 명단의 인덱스번호를 추출한다
        	
            // 명단의 위치를 앞뒤로 바꿔줌과 동시에  map의 위치도 앞뒤로 동일하게 바꿔준다
            // 임시 문자열 변수를 사용해서 값을 바꿔준다
        	String temp = "";
        	temp = answer[index-1];
        	answer[index-1] = callings[i];		
        	mapName.put(callings[i], index-1);
        	
        	answer[index] = temp;
        	mapName.put(temp, index); 	
        }
        return answer;
    }
}
  • 어려웠던 점
    -> 시간복잡도를 줄이기 위해서 Map을 사용하려고 하는데도, key값을 index번호로 했을 때 크게 위에 풀이와 다를게 없다고 생각하였고, 선수의 이름을 중복되지 않는다는 조건을 생각하였고, for문을 최소로 사용하기 위해서, map의 키값을 선수의 이름으로 지정하였다
profile
우측 상단 햇님모양 클릭하셔서 무조건 야간모드로 봐주세요!!

0개의 댓글