https://school.programmers.co.kr/learn/courses/30/lessons/178871
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을 사용하여 이름과 순위를 키, 벨류 그리고 순위와 이름을 키, 벨류로 하여 불린 이름이 몇 순위인지, 그 이전 순위였던 사람의 이름을 바로 찾을 수 있고 바꿀 수 있게 만들어서 문제를 해결하였다.
'Programmers' 카테고리의 다른 글
[프로그래머스][JAVA]Lv. 2 - n진수 게임 (1) | 2023.04.27 |
---|---|
[프로그래머스][JAVA]Lv. 2 - 파일명 정렬 (0) | 2023.04.21 |
[프로그래머스][JAVA]Lv. 2 - 압축 (0) | 2023.04.11 |
[프로그래머스][JAVA]Lv. 2 - 연속된 부분 수열의 합 (0) | 2023.04.08 |
[프로그래머스][JAVA]Lv. 2 - 방금그곡 (0) | 2023.04.07 |