문제의 카테고리는 깊이/너비우선탐색이다. 학교다닐때 알고리즘 수업을 아예 안듣다시피해서 아무것도 모른다고 봐도 과언이아니다. 그래서 알고리즘 문제가 나오면 항상 막막하고 인터넷에서 해당 알고리즘에 대하여 공부부터하고 코딩을 했었다.
알고리즘을 떠나 이 문제를 보고 떠오른 방식은 트리였다. 맨 처음 수 부터 다음 수를 더한것
과뺀것
을 쭉 저장하면 층층으로 이루어진 트리구조로 나올 것 같았다. 이렇게 계산을 한다면 numbers
의 사이즈가 커질수록 계산이 너무 커지겠지만 일단은 이 방식으로 해보자.
temp
를 선언한다.itorator
로 numbers
의 원소에 접근한다.node
를 하나 더 선언한다. (numbers
의 원소 하나마다 초기화되어야 하므로)itorator
로 temp
의 원소에 접근한다.node
에 numbers
의 원소first
와 temp
의 원소 second
를 더해서 저장한다.node
에 numbers
의 원소first
와 temp
의 원소 second
를 빼서 저장한다.first
에 대한 연산이 끝나면 temp
를 node
로 바꿔준다.temp
가 완성되면 filter
를 사용하여 target
과 같은 값들의 수를 answer
에 저장한다.레고레고
시간초과는 변순데....?
바꿔줄 만한 건 temp
와 node
의 타입이나 node
에 연산결과를 더해주는 부분 정도인듯하다.
일단 Array
로 선언했던 변수들을 Arraylist
로 바꿔보자.
...?
연산결과가 너무 방대해져서 시간이 오래 걸릴 줄은 알았지만 아예 시간초과가 나올 줄은 몰랐다.
Array = Array.plus(Int)
이 부분이 좀 신경 쓰이기는 한다. 값을 배열에 저장해주는 느낌이 아니라 배열을 교체하는(?) 것 같아서 자원이 많이드는 듯 하다. 아마도 Array
는 변경이 불가능한 형태이기 때문에 데이터를 추가하는 것이 아닌 새롭게 배열을 선언을 해주는 방법으로 업데이트가 가능한 것 같다.
다른 방법을 좀 찾아보자.
Array
안에서 답이 안나와서 Arraylist
로 변경 후 add
함수를 사용했더니 통과를 하긴했다. 테스트 5같은 경우는 바꾸기전에 1398ms라는 어마어마한 시간이 걸렸지만 지금은 현저하게 줄어든 것을 볼 수 있다. Arraylist
가 널리 쓰이는 이유를 한번 더 인지할 수 있었다.