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

WAS·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개의 댓글

Powered by GraphCDN, the GraphQL CDN