1052번 - 물병
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을 추가했는지 셌다가 그 값을 출력)
++ 시간초과는 해결했습니다!! 근데 오답이 나오는데 그 이유를 알고 싶네요 ㅠㅠ
제출하신 프로그램이 이게 맞습니까?
문제에서 주어진 예제 입력 데이터를 넣었을 때, 화면에 보이는 결과가 숫자 "1" 이 아니라 아스키 코드 0x01 이 찍힙니다.
에고 제가 실험하던걸 올렸네요; bw.write 부분에 toString 붙이는걸 깜빡했습니다
이 프로그램은 "상점에서 물병을 사지 않아도 된다" 를 "정답이 없다"라고 판단하고 있는 것 같습니다.
또한, 옮겨야 하는 물병의 수가 k보다 작을 경우 무한루프에 빠지는 것 처럼 보입니다.
헉 문제를 잘못 이해하고 있었네요. 근데 "정답이 없다"라는 경우는 어떤 경우인가요?? 잘 이해가 안가네요...
의도치 않은 스포일을 방지하기 위해 일부 텍스트를 가립니다.
정답이 없는 경우는 없습니다. 모든 입력 데이터에 대해서 답을 계산할 수 있습니다.
앗 텍스트가 가려졌네요
힌트를 보기 원하지 않는 사람이 있을 것 같아서 텍스트를 일부러 가렸습니다.
힌트를 보고 싶으시면 드래그하세요.
아하 감사합니다!!
제 풀이의 문제는 큰 수가 나올 경우에는 해결하지 못하는 것이었습니다.
N = 13, K = 2 같은 경우는 금방 해내지만 N = 1000000, K=5 같은 경우는 시간이 엄청 걸립니다.
왜냐하면 제 알고리즘은 물을 직접 한번씩 다 더하는 방식이라 1000000의 경우 while문이 50만번 실행됩니다;; 이걸 당연히 해낼거라고 생각한 제가 바보였습니다 ....
그래서 이진법으로 풀었습니다!!
댓글을 작성하려면 로그인해야 합니다.
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을 추가했는지 셌다가 그 값을 출력)
++ 시간초과는 해결했습니다!! 근데 오답이 나오는데 그 이유를 알고 싶네요 ㅠㅠ