nhg1113   3년 전

bufferedreader와 bufferedwriter를 모두 사용했는데도 시간초과가 납니다.

스캐너를 썼을떄랑 똑같은데 이건 제 알고리즘의 문제인가요?

일단 제 알고리즘을 설명해드리자면, 일단 두개의 while문으로 되어있습니다.

큰 while문과 작은 while문, 겉과 속의 while문으로 구성되어있는데 안에거 부터 설명을 드리자면 이렇습니다.

arraylist에 N의 수만큼 1로 채웁니다.

그리고 끝과 처음을 비교해서 둘이 같으면 첫번째에 1을 더해주고 맨 뒤의 원소는 제거합니다.

그럼 만약 

1 1 1 1 1 1 1 이 있다고 치면 저 작은 while문이 실행되면

2 1 1 1 1 1 이 되는 것이죠.

큰  while문은 이것을 반복해주는 역할을 합니다.

작은 while문에서 더이상 1 1 페어가 나오지 않는 상황에 도달했는데 목표인 K개로 줄이기를 성공하지 못했다면,

그때 맨 뒤에 1을 더해주고 다시 2의 페어를 만듭니다.

<알고리즘 진행도>

N = 7 원래 물병 개수

K = 2  가지고 가려는 물병 개수

입력할 경우 

1 1 1 1 1 1 1

2 1 1 1 1 1

2 2 1 1 1

2 2 2 1

(목표인 2개 원소로 줄이기를 실패했으니 1추가)

2 2 2 1 1

2 2 2 2

(전부다 2만 남았는데도 2개 원소 줄이기를 실패했으니 다시 처음 반복)

4 2 2

4 4 

(두개가 되었으니 종료, 몇번 1을 추가했는지 셌다가 그 값을 출력)

++ 시간초과는 해결했습니다!! 근데 오답이 나오는데 그 이유를 알고 싶네요 ㅠㅠ

bupjae   3년 전

제출하신 프로그램이 이게 맞습니까?

   

문제에서 주어진 예제 입력 데이터를 넣었을 때, 화면에 보이는 결과가 숫자 "1" 이 아니라 아스키 코드 0x01 이 찍힙니다. 

nhg1113   3년 전

에고 제가 실험하던걸 올렸네요; bw.write 부분에 toString 붙이는걸 깜빡했습니다

bupjae   3년 전

이 프로그램은 "상점에서 물병을 사지 않아도 된다" 를 "정답이 없다"라고 판단하고 있는 것 같습니다.

또한, 옮겨야 하는 물병의 수가 k보다 작을 경우 무한루프에 빠지는 것 처럼 보입니다.

nhg1113   3년 전

헉 문제를 잘못 이해하고 있었네요. 근데 "정답이 없다"라는 경우는 어떤 경우인가요?? 잘 이해가 안가네요...

bupjae   3년 전

의도치 않은 스포일을 방지하기 위해 일부 텍스트를 가립니다.

정답이 없는 경우는 없습니다. 모든 입력 데이터에 대해서 답을 계산할 수 있습니다.

nhg1113   3년 전

앗 텍스트가 가려졌네요

bupjae   3년 전

힌트를 보기 원하지 않는 사람이 있을 것 같아서 텍스트를 일부러 가렸습니다.

힌트를 보고 싶으시면 드래그하세요.

nhg1113   3년 전

아하 감사합니다!!

nhg1113   3년 전

제 풀이의 문제는 큰 수가 나올 경우에는 해결하지 못하는 것이었습니다.

N = 13, K = 2 같은 경우는 금방 해내지만 N = 1000000, K=5 같은 경우는 시간이 엄청 걸립니다.

왜냐하면 제 알고리즘은 물을 직접 한번씩 다 더하는 방식이라 1000000의 경우 while문이 50만번 실행됩니다;; 이걸 당연히 해낼거라고 생각한 제가 바보였습니다 ....

그래서 이진법으로 풀었습니다!! 

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