dl0312   6년 전

질문게시판에 올라온 테스트케이스는 다 통과하고

4로 나올 수 있는 배열들 넣었을 때도 맞게 나왔는데 어디서 잘못된건지 모르겠습니다...


Stack을 push로 채워나가다 list의 타겟이 되는 곳과 같으면 pop하는 로직으로 짰습니다.

NO가 뜨는 경우는 Queue q에서 다 가져왔는데도 s.peek()과 list의 타겟이 되는 곳이 같지 않는 경우입니다.

다른분들처럼 런타임에러나 출력초과라면 구조를 바꿔볼텐데 그것도 아니고 틀렸습니다가 뜨네요 ㅠㅠ

틀리는 테스트 케이스라도 제시해주시면 감사하겠습니다!

djm03178   6년 전

우선, int와 Integer는 다르다는 것을 아셔야 합니다. 자바에서 Integer를 어떻게 다루는지 정확히는 모르겠으나, 아마도 127까지의 객체는 미리 만들어 두고 나머지에 대해서만 필요할 때 생성하는 것으로 보입니다.

Integer는 클래스이므로, 두 Integer 객체를 == 연산하는 것은 두 객체가 같은 객체인지를 비교합니다. 즉, 똑같이 1000 이라는 값을 담고 있는 Integer 객체라고 해도 둘은 서로 별개의 객체일 수 있습니다. 질문 게시판에 있는 예시들은 대체로 매우 작은 케이스들이므로, 아마도 Java가 내부적으로 미리 만들어 둔 객체들이 대신 사용되어 같은 값을 가진 객체에 대해 ==가 항상 true를 반환하나, 더 큰 케이스로 테스트하면 false가 나타나게 됩니다.

그래서 두 Integer 객체가 가지고 있는 값이 같은지를 비교할 때는 반드시 .intValue() 메서드를 통해서 완전한 int 값을 받아와야 하는 것이지, 단순히 == 만으로 비교해서는 안 됩니다.


이를 해결하고 나면 또 다른 문제가 있습니다. 바로 figure.get(i)와 list.get(target_l) 입니다. figure와 list는 모두 LinkedList 객체입니다. 그런데, 링크드 리스트가 어떻게 동작하는지 아시나요? i번째 노드를 찾으려면 어떻게 해야 할까요? 리스트의 처음부터 하나씩 탐색하면서 i개를 탐색할 때까지 전진해 나가야 할 것입니다. 그렇다면, 1부터 n까지의 원소를 n번 찾으려면 시간이 무려 O(N^2)이 걸립니다. 즉, 시간 초과가 됩니다.

그래서 여기서는 LinkedList가 아닌 ArrayList를 써야, i번째 원소에 접근하는 것을 O(1)에 할 수 있습니다. LinkedList는 처음이나 끝 원소에만 관심이 있을 때 써야 하는 자료구조이지, 임의의 인덱스에 바로 접근하기 위한 목적으로는 매우 부적절합니다.


이들을 고쳐서 내니 맞았습니다.

dl0312   6년 전

정성스러운 답변 정말 감사합니다!

말씀해주신대로 수정해서 고치니 통과했습니다.

Integer에 대한 공부가 부족해서 계속 ==으로 풀었었는데 덕분에 하나 깨우치고 갑니다... 이것때문에 다른 문제들도 틀릴뻔했네요

LinkedList와 ArrayList도 계속 LinkedList만 사용했었는데 사용목적에 따라 사용해야한다는 것도 알려주셔서 감사합니다.

생각지 못한 곳에서 틀리니 제가 자바에 대한 기초가 부족하다는 걸 느끼네요.. ㅠㅠ 좀 더 배워야할 것 같습니다.

다시 한 번 답변 달아주셔서 감사합니다!

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