본문 바로가기
알고리즘/프로그래머스

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

by KDW999 2023. 4. 11.

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

 

프로그래머스

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

programmers.co.kr

 

 

문제 접근

for문만 사용하면 시간초과가 뜨더라 

그래서 map을 쓰면 되겠거니 했는데 map을 사용할 땐 호명되는 선수의 순위를 높일 순 있어도 추월당한 선수의 순위를 줄이는 방법이 생각이 안나더라

이 방법 저 방법 머리 돌리다 결국 빙빙 돌아서 찾게 되었다.

 

players 배열의 인덱스로 map에 있는 선수들의 순위를 사용하였다. 

추월당할 선수의 이름은 temp에 저장, 이후 추월당한 선수의 자리에 호명 선수의 이름을 넣고 호명되었던 선수의 자리temp(추월당한 선수 이름)를 넣어주는 식으로 위치를 바꿔주었다.

이후 map에도 순위 변화

import java.util.*;

class Solution {
   public String[] solution(String[] players, String[] callings) {
		
		 Map<String, Integer> playersMap = new HashMap<>();
		 for(int i=0; i<players.length; i++) playersMap.put(players[i], (i+1));
		 
		 for(int i=0; i<callings.length; i++) {
			 String temp = "";
			 temp = players[playersMap.get(callings[i])-2];
			 players[playersMap.get(callings[i])-2] = players[playersMap.get(callings[i])-1];
			 players[playersMap.get(callings[i])-1] = temp;
			 
			 playersMap.put(callings[i], playersMap.get(callings[i])-1);
			 playersMap.put(temp, playersMap.get(temp)+1);
			 
		}
		return players;
	}
}

 

다른 사람 풀이

순위와 플레이어에 대한 map을 2개 만들어서 활용

values()는 map의 value들을 하나씩 꺼내올 수 있다. ↔ key만 가져오는 건 keySet()

import java.util.*;

class Solution {
    public String[] solution(String[] players, String[] callings) {
        Map<Integer, String> rank = new HashMap<>();
        Map<String, Integer> player = new HashMap<>();

        for (int i = 0; i < players.length; i++) {
            rank.put(i + 1, players[i]); // 순위 , 이름 hashmap
            player.put(players[i], i + 1); // 이름, 순위 hashmap
        }

        for (String curPlayer : callings) {
            int curRank = player.get(curPlayer); // 현재 플레이어의 순위
            int frontRank = curRank - 1;         // 앞 플레이어의 순위
            String frontPlayer = rank.get(frontRank); //앞 플레이어 이름

            rank.put(frontRank, curPlayer); // 추월할 선수 이름 앞으로
            rank.put(curRank, frontPlayer); // 추월 당한 선수 뒤로
            player.put(frontPlayer, curRank); // 추월 당한 선수 순위 다운
            player.put(curPlayer, frontRank); // 추월한 선수 순위 업
        }

        String[] answer = new String[players.length];
        int cnt = 0;
        for(String s : rank.values()){
            answer[cnt++] = s;
        }

        return answer;
    }
}

댓글