mamamau   6년 전

석순과 종유석의 상대적 위치차를 고려해 코드를 짰고, 틀렸습니다.
질문 게시판을 참고했을 때 정답으로 인정받으신 분과 코드에서 차이가 없었습니다.
왜 안되는 걸까요??

sgchoi5   6년 전

CHCI 문제는 대회에서 사용했었던 TC (Judge Data) 가 공개되어 있습니다. 에러가 발생하는지 한 번 해보셔요.

http://gooddaytocode.blogspot....

mamamau   6년 전

감사합니다. 테스트 케이스 돌려봤더니 문제를 확인할 수 있었네요. 

원래는 for문에서 ArrayList의 get 메소드를 통해 개별 원소에 접근하는 방식을 사용했는데 이게 문제였습니다.

for( int k = 0 ~ sum.size() ) 까지 진행시켰었는데 테스트 케이스를 넣자 1번만 돌아가고 나와버리더라구요. 

그래서 그냥 iterator를 사용해 카운트하니 제대로 돌아갔습니다. 

저 부분은 아직도 이해가 안되네요...

mamamau   6년 전

작은 케이스는 문제 없이 돌아가는데 

N = 36000, H = 36000 정도가 들어가니 저 문제가 발생합니다.

bupjae   6년 전

Integer 객체에 대해서 reference equal (==) 를 사용하셨습니다.

Java에서는 어떤 값을 나타내는 객체 (value object 라고도 부릅니다)의 동일성을 비교하기 위해서는 == 가 아니라 .equals 를 사용해야 합니다.



mamamau   6년 전

음. 말씀 감사합니다. 덕분에 정확한 이해가 가능했습니다.

그런데 하나 더 여쭙자면 작은 케이스에 대해선 for문이 정상적으로 돌아가다가 큰 케이스에선 제대로 안돌아가는 이유가 뭔가요??

bupjae   6년 전

지금부터 설명할 내용은 java 컴파일러 및 인터프리터 내부의 최적화와 관련된 내용입니다. OS, java 버전, 최적화 적용 여부 등에 따라 언제든지 변경될 수 있는 내용이므로 지금 설명드리는 내용에 의존하는 코드를 작성해서는 안됩니다.


int -> Integer 로 형변환이 일어날 때 (이를 boxing conversion 이라고 합니다) 절대값이 작다면 cache를 이용한 최적화를 수행할 수 있습니다.

예를 들어서 서로 다른 연산의 결과로 각각 (Integer)20 를 얻었다면, 이 값은 == 로 비교했을 때 대부분 true 를 반환하는 반면

서로 다른 연산의 결과로 각각 (Integer)100000 을 얻었다면, 이 값은 == 로 비교했을 때 대부분 false를 반환합니다.


다시 한 번 말씀드리지만 실제 코드를 작성할 때 이런 내부 최적화에 의존하는 코드를 작성하시면 안 되며, Integer (int 아님)을 비교할 때는 반드시 .equals 를 사용해야 합니다.

mamamau   6년 전

생각 없이 써왔었는데 앞으론 주의해야겠네요. 
친절한 설명 감사드립니다!

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