저울 추 고르기
문제
한 공방에는 접시가 두 개 달린 저울이 하나 있고, 추가 여러 개 있다. 추의 무게는 정해진 규칙으로 늘어난다. 첫째 추는 1이고 둘째 추는 2이며, 셋째 추부터는 바로 앞의 두 추의 무게를 더한 값이다. 그래서 추의 무게는 1, 2, 3, 5, 8, 13, 21, 34, 55, 89처럼 이어진다. 같은 무게의 추는 하나씩만 있어서 한 번 올린 무게의 추를 다시 올릴 수는 없다.
손님이 무게를 말하면 공방 주인은 한쪽 접시에 추를 올려서 그 무게를 정확히 맞춘다. 올린 추의 무게를 모두 더한 값이 손님이 말한 무게와 같아야 한다. 이때 올리는 추의 개수는 되도록 적어야 한다.
한 번에 여러 손님을 받을 수 있다. 손님의 수 T가 주어지고 손님마다 말한 무게가 하나씩 주어졌을 때, 손님마다 가장 적은 개수로 그 무게를 맞추는 추의 무게를 작은 것부터 차례대로 구하는 프로그램을 작성하여라. 무게가 1,000,000,000을 넘는 추까지 있으므로 어떤 무게든 반드시 맞출 수 있다.
예를 들어 어떤 손님이 무게 100을 말했다고 해보자. 무게가 100 이하인 추 가운데 가장 무거운 것은 89이다. 89를 올리면 11이 남고, 11 이하인 추 가운데 가장 무거운 것은 8이다. 8을 올리면 3이 남고, 무게가 3인 추가 있으므로 그것을 올리면 남는 무게가 없다. 이 과정을 적으면 다음의 표와 같다.
| 단계 | 남은 무게 | 올리는 추 |
|---|---|---|
| 1 | 100 | 89 |
| 2 | 11 | 8 |
| 3 | 3 | 3 |
| 4 | 0 | 없음 |
올린 추는 3과 8과 89의 세 개이고 세 무게를 더하면 100이다. 작은 것부터 적으면 3, 8, 89이므로 현재 예시에서 이 손님에 대한 답은 이 세 수다. 추를 두 개 이하로 올려 100을 맞추는 방법은 없다.
다른 손님이 무게 12를 말했다면 8을 올리고 4가 남으며, 4 이하인 추 가운데 가장 무거운 3을 올리면 1이 남고, 무게가 1인 추를 올리면 끝난다. 이 경우의 답은 1, 3, 8이다.
입출력 예시
예시 1
입력
2 100 1000000000
출력
3 8 89 1 5 13 89 233 1597 28657 75025 196418 514229 5702887 24157817 267914296 701408733
예시 2
입력
1 325631899
출력
1 3 8 21 89 233 610 1597 4181 46368 121393 3524578 14930352 39088169 267914296
예시 3
입력
1 150128012
출력
5 55 144 610 2584 6765 28657 75025 196418 514229 2178309 5702887 39088169 102334155
입력 조건
가장 먼저 손님의 수 T가 첫째 줄에 주어진다. T는 1 이상 20 이하의 자연수다.
이어서 둘째 줄부터 T+1번째 줄까지 각 손님이 말한 무게가 한 줄에 하나씩 주어진다. 각 무게는 1 이상 1,000,000,000 이하의 자연수다. 한 줄에 수가 하나씩 오므로 입력은 모두 T+1줄이다.
추의 무게는 입력으로 주어지지 않는다. 1과 2에서 시작해 바로 앞의 두 무게를 더해 가며 늘어나는 규칙으로 직접 만들어 쓴다.
출력 조건
손님마다 한 줄씩, 올리는 추의 무게를 작은 것부터 차례대로 입력에 주어진 순서대로 출력한다.
각 수 뒤에 공백을 하나 붙여서 출력한다. 그래서 줄의 마지막 수 뒤에도 공백이 하나 남는다.
한 손님의 답을 적은 뒤에는 줄을 한 번 바꾼다. 마지막 줄 다음에 빈 줄을 더 붙이지는 않는다.
채점은 출력을 기대값과 글자 하나까지 견준다. 줄 끝의 공백이 없으면 추를 맞게 골랐어도 틀린 답으로 처리된다. 예를 들어 손님이 말한 무게가 1이면 출력해야 하는 글자는 1과 공백과 줄바꿈의 세 글자다.
요구사항
- 입력은 표준 입력으로 받고 답은 표준 출력으로 내보냅니다
- 추의 무게는 1과 2로 시작해 바로 앞의 두 무게를 더해 가며 늘어납니다. 같은 무게의 추는 하나뿐이라 두 번 올릴 수 없습니다
- 올린 추의 무게를 모두 더한 값이 손님이 말한 무게와 정확히 같아야 하고, 그 가운데 추의 개수가 가장 적어야 합니다
- 한 줄에 한 손님의 답을 작은 무게부터 출력하며, 줄의 순서는 입력에 주어진 순서와 같습니다
- 각 수 뒤에 공백을 하나 붙이므로 줄의 마지막 수 뒤에도 공백이 하나 남습니다. 아래 예시의 각 줄 끝에는 눈에 보이지 않는 공백이 하나씩 있습니다
- 채점은 출력을 기대값과 글자 하나까지 견줍니다
- 표준 입력으로 읽고 표준 출력으로 내보내는 프로그램을 짜야 합니다
- 쓸 수 있는 말은 파이썬, 자바스크립트입니다
- 메모리 제한은 256MB입니다. 브라우저에서는 재지 않고 적기만 합니다
- 시간 제한은 출제자의 정답 코드를 같은 런타임에서 재서 정합니다
- 이 문제는 프롬프트가 아니라 코드를 냅니다. 그 코드는 이 기기의 브라우저에서 돌고, 서버로는 나온 출력의 지문과 걸린 시간만 갑니다. 맞았는지는 서버가 정합니다. 실행 시간은 각자 기기가 적어 보내는 값이라, 코드와 기기 정보를 순위표에 같이 내걸어 둡니다.
- 케이스는 15개이고, 그 가운데 3개는 입력과 기대 출력을 함께 보여 줍니다. 나머지는 제출할 때만 쓰이고 화면에는 보여 주지 않습니다.
- 케이스 15개를 전부 통과해야 해결입니다.
예시
공개 케이스 3개입니다. 채점에는 숨은 케이스가 함께 쓰입니다. 케이스 15개를 전부 통과해야 해결입니다.
2 100 1000000000
3 8 89 1 5 13 89 233 1597 28657 75025 196418 514229 5702887 24157817 267914296 701408733
1 325631899
1 3 8 21 89 233 610 1597 4181 46368 121393 3524578 14930352 39088169 267914296
1 150128012
5 55 144 610 2584 6765 28657 75025 196418 514229 2178309 5702887 39088169 102334155
풀이
코드는 이 기기에서돕니다. 서버로는 나온 출력의 지문과 걸린 시간만 갑니다. 맞았는지는 서버가 정합니다.
제출은 로그인 하셔야 됩니다. 공개 케이스로 돌려보는 것은 로그인 없이도 됩니다.
공개 케이스 3개로 돌려보기가 됩니다. 제출하면 숨은 케이스까지 돕니다.
이 문제를 푼 사람
아직 없습니다. 첫 번째가 되실 수 있습니다.