Algorithm/CodingTest

[Programmers] Level.1 달리기 경주(Java)

누구세연 2023. 10. 24. 22:56

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

 

프로그래머스

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

programmers.co.kr

 

달리기 경주라는 문제 Java로 문제 풀이하겠습니다.

문제 설명
입출력 예

이 문제는 해설자가 특정 선수를 불렀을 때 해당 선수가 앞으로 이동하여 추월하는 상황을 다루고 있습니다.

 

저는 다음과 같이 풀이하였습니다.

import java.util.Map;
import java.util.HashMap;

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

저는 HashMap 자료 구조를 사용하여 문제를 풀이하였습니다.

HashMap은 key-value를 쌍으로 데이터를 저장하는 자료구조입니다.

특정 키를 사용하여 값을 찾는데 빠른 검색 속도를 제공하기 때문에 배열에서 선수의 순서를 찾을 때 유용할 것이라고 판단하였습니다.

 

  1. 먼저 선수들의 이름을 기반으로 순서를 저장합니다.
    HashMap을 생성하여 key는 이름으로 value는 순서를 저장합니다.
  2. 호출되는 요소에 대하여 for문을 돌면서 순차적으로 처리합니다.
    orderMap에서 호출된 선수의 순서를 가지고 옵니다.
    만약, 선수의 순서가 0보다 크다면(맨 앞이 아니라면) 다음을 수행합니다.
    - 현재 선수의 이전 위치의 선수를 임시 변수 temp에 저장합니다.
    - 현재 선수의 이전 위치에 호출된 선수의 이름을 넣습니다.
    - 현재 선수의 위치에는 temp에 저장해 둔 이전 선수의 이름을 넣습니다.
    - orderMap을 업데이트하여 각 선수의 새로운 위치를 반영합니다.
  3. 마지막으로 변경된 players 배열을 반환합니다.

 

이 방법을 통해 각 호출에 따라 선수들의 순서를 변경할 수 있습니다.

다른 이견이 있으시다면 댓글에 자유롭게 남겨주세요.