본문 바로가기

Programmers

[프로그래머스][JAVA]Lv. 1 - 달리기 경주

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

 

프로그래머스

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

programmers.co.kr

callings 배열에서 선수 이름이 불릴 때마다 이전 사람과 순위를 바꾸는 문제

// 실패 코드
import java.util.ArrayList;
import java.util.Arrays;
class Solution {
    public String[] solution(String[] players, String[] callings) {
        String[] answer = {};

        ArrayList<String> st = new ArrayList<>(Arrays.asList(players));
        for (int i = 0; i < callings.length; i++) {
            String callingName = callings[i];
            int index = st.indexOf(callingName);
            String temp = st.get(index-1);
            st.set(index-1, st.get(index));
            st.set(index, temp);
        }
        answer = st.toArray(new String[0]);

        return answer;
    }
}

List형으로 바꿔서 .indexOf() 으로 해당 이름을 찾아 인덱스 번호를 찾고 그것으로 순위를 바꾸면 for() 문 안에서 .indexOf()가 동작하면서 해당 이름으로 인덱스를 찾기 위해 걸리는 시간이 있기 때문에 찾는 범위가 커진다면 시간 오류가 발생하게 된다.

import java.util.HashMap;
class Solution {
    public String[] solution(String[] players, String[] callings) {
        String[] answer = new String[players.length];

        HashMap<Integer, String> IntegerString = new HashMap<>();
        HashMap<String, Integer> StringInteger = new HashMap<>();
        for (int i = 0; i < players.length; i++) {
            IntegerString.put(i+1, players[i]);
            StringInteger.put(players[i], i+1);
        }
        for (int i = 0; i < callings.length; i++) {
            int number = StringInteger.get(callings[i]);
            String name = IntegerString.get(number);
            String oldName = IntegerString.get(number-1);

            StringInteger.replace(name, number-1);
            StringInteger.replace(oldName, number);
            IntegerString.replace(number-1, name);
            IntegerString.replace(number, oldName);
        }
        for (int i = 0; i < IntegerString.size(); i++) {
            answer[i] = IntegerString.get(i+1);
        }

        return answer;
    }
}

HashMap을 사용하여 이름과 순위를 키, 벨류 그리고 순위와 이름을 키, 벨류로 하여 불린 이름이 몇 순위인지, 그 이전 순위였던 사람의 이름을 바로 찾을 수 있고 바꿀 수 있게 만들어서 문제를 해결하였다.