문제를 통해 새롭게 배운 부분 OR 느낀점
처음 문제를 풀었을 때 정답처리는 되었으나 생각보다 속도가 너무 느려서 놀랐다.
(for문을 돌때마다 배열을 문자열로 바꿨다가 인덱스를 찾았다가 수정했다가 바빴으니 당연히 그럴 수 밖에😱)
다른 사람들은 어떻게 풀었는지 참고하면서 다시 문제를 풀어보았다.getOrDefault()
를 사용해서 풀었더니 속도가 최대 30배 가까이 줄었다!
코딩테스트를 풀 때 문제에 접근하는 방식도 중요하지만 활용할 수 있는 함수를 많이 익히는 것도 중요하다는 것을 다시 한 번 느꼈다!
s
를 char[]
로 변환arr[i]
가 처음 나오는 index
와 i
가 같으면 -1 반환i - index
반환 arr[index]
값 변경import java.util.Arrays;
class Solution {
public int[] solution(String s) {
int[] answer = new int[s.length()];
char[] arr = s.toCharArray();
for(int i = 0; i < arr.length; i++) {
int index = String.valueOf(arr).indexOf(arr[i]);
if(index == i) {
answer[i] = -1;
} else {
answer[i] = i - index;
arr[index] = 0;
}
}
return answer;
}
}
HashMap
을 선언s.charAt(i)
가 있다면 해당 인덱스 반환i + 1
반환 (answer[i]
에 -1 을 담기 위함)s.charAt(i)
, value : i
를 넣는다. (Key가 이미 있다면 value만 변경 됨)import java.util.HashMap;
class Solution {
public int[] solution(String s) {
int[] answer = new int[s.length()];
HashMap<Character, Integer> map = new HashMap<Character, Integer>();
for(int i = 0; i < s.length(); i++) {
char ch = s.charAt(i);
answer[i] = i - map.getOrDefault(ch, i + 1);
map.put(ch, i);
}
return answer;
}
}