다음 단계에 따라 문제를 분석하였다.
배열의 요소를 담을 Set을 선언(중복불허)
for(A의 길이만큼 수행){
Set에 요소를 하나씩 add
if(Set의 길이가 X와 동일하면) return 인덱스;
}
반복문이 정상종료되면 return -1;
import java.util.Set;
import java.util.HashSet;
pubilc class Solution{
public int solution(int X, int[] A){
Set<Integer> set = new HashSet<>();
for(int i = 0; i < A.length; i++){
set.add(A[i]);
if(set.size() == X) return i;
}
return -1;
}
}
위와 같은 코드는 Time Out을 몇번을 치루고야 나왔다. 이전의 코드는 정확성은 100%이지만 퍼포먼스 측면은 0%이었다. 코드는 다음과 같다.
import java.util.List;
import java.util.ArrayList;
pubilc class Solution{
public int solution(int X, int[] A){
List<Integer> list = new ArrayList<>();
for(int i = 1; i <= X; i++){
list.add(i);
}
for(int i = 0; i < A.length; i++){
// 매개변수로 Object를 넣어줘야 value를 찾아 삭제함.
list.remove(Integer.valueOf(A[i]);
if(list.size() == 0) return i;
}
return -1;
}
}
여기서 나는 시간복잡도를 O(X+n)으로 판단했는데 문제는 그게 아니었다. List의 자료구조 특성상 remove를 하기 위해 인덱스가 아닌 value를 찾는 것은 list를 순회하며 수행된다는 사실을 고려하지 않은 것이다. 문제를 다 풀고서야 TimeOut을 보고 깨달았다. 다른 분들은 이런 실수를 하지 않기 바라는 마음에서 적어본다.