yoodly   5년 전

안녕하세요.

얼마 전에 JAVA 재채점으로 시간 초과가 발생했는데, BufferedReader, BufferedWriter로 IO를 개선해 봐도 똑같이 시간초과가 발생합니다.

위상정렬을 사용해서 O(N)으로 풀어서 로직으로는 시간을 더 줄일 수 없는 것 같은데, 12% 인근에서 시간 초과가 계속 발생하네요.

입력 테스트 케이스가 뭐길래 그런지.. ㅠㅠ 

조언 부탁드립니다~

yoodly   5년 전

조언 감사드립니다. 

StringBuffer를 사용하지 않고 BufferedWriter에 바로 추가를 했는데도 역시나 4%에서 진행하다가 time out이 나네요 ㅠ (위의 질문과 동일 위치)


djm03178   5년 전

그것과 거의 똑같은 이유로 시간이 오래 걸리는 것이 또 있습니다.

main 메서드에서 ar을 한 번만 만들어두고 이후에는 매 테스트 케이스마다 0~N까지의 인덱스에 새로운 ArrayList를 끼워넣는 식으로 구현하고 있는데 이러면 새 오브젝트를 추가할 때마다 기존에 그 인덱스 이후에 있던 모든 오브젝트들이 전부 한 칸씩 뒤로 밀려나야 합니다. 그래서 테케마다 누적될수록 더욱 많은 시간이 걸립니다.

매 테스트 케이스마다 ar = new ArrayList<ArrayList<Cave>>(); 를 새로 해주면 통과됩니다.

yoodly   5년 전

제가 테케 마다 객체를 생성하지 않고 맨 앞에서  한번만 객체를 생성한지 생각도 못헀지만, 그게 문제인지는 정말 꿈에도 생각하지 못했습니다.

해결할 때까지 보아주셔서 정말로 감사드립니다~ ^^ 

djm03178   5년 전

배열 형태의 자료구조에서 임의의 위치에 새로운 원소를 끼워넣는 메서드 자체를 사용하지 않는 것이 좋습니다. ArrayList의 경우 add 메서드의 첫 번째 인자로 인덱스를 넘겨줘야 할 일은 거의 없습니다. 배열의 형태라면 맨 끝에 추가/삭제, 임의의 위치에 접근/수정만 사용하는 것이지 중간에 원소를 끼워넣거나 빼는 연산의 시간은 항상 뒤에 있는 원소들 전체에 영향을 받는다는 사실을 잊지 마세요.

댓글을 작성하려면 로그인해야 합니다.