그냥 그리디하게 해주면 됩니다.
정답 코드 (Assembly):
section .rodata
d_in_: db " %d",0
q_in_: db " %lld",0
s_in_: db " %s",0
d_out_ln: db "%d",10,0
q_out_ln: db "%lld",10,0
s_out_: db "%s",0
c_out_: db "%c",0
section .data
d_in_val_: dd 0
q_in_val_: dq 0
; dget address
%macro dget 1
mov rdi, d_in_
mov rsi, %1
xor rax, rax
call scanf
%endmacro
; == dget &eax
%macro dget 0
mov rdi, d_in_
mov rsi, d_in_val_
xor rax, rax
call scanf
mov eax, [d_in_val_]
%endmacro
%macro sget 1
mov rdi, s_in_
mov rsi, %1
xor rax, rax
call scanf
%endmacro
; qget address
%macro qget 1
mov rdi, q_in_
mov rsi, %1
xor rax, rax
call scanf
%endmacro
; == qget rax
%macro qget 0
mov rdi, q_in_
mov rsi, q_in_val_
xor rax, rax
call scanf
mov rax, [q_in_val_]
%endmacro
%macro putc 1
mov rdi, c_out_
mov sil, %1
xor rax, rax
call printf
%endmacro
%macro sprint 1
mov rdi, s_out_
mov rsi, %1
xor rax, rax
call printf
%endmacro
; dprintln value
%macro dprintln 1
mov rdi, d_out_ln
mov esi, %1
xor rax, rax
call printf
%endmacro
; == dprintln eax
%macro dprintln 0
dprintln eax
%endmacro
; qprintln value
%macro qprintln 1
mov rdi, q_out_ln
mov rsi, %1
xor rax, rax
call printf
%endmacro
%macro qprintln 0
qprintln rax
%endmacro
; uses r11 to add
%macro addd 2
mov r11, %1
add r11, %2
mov %1, r11
%endmacro
%macro open 0
push rbp
mov rbp, rsp
%endmacro
%macro open 1
push rbp
mov rbp, rsp
sub rsp, %1
%endmacro
%macro close 0
leave
ret
%endmacro
%macro terminate 0
xor rax, rax
leave
ret
%endmacro
%macro terminate 1
mov rax, %1
leave
ret
%endmacro
section .text
global main
extern scanf
extern printf
extern strcmp
section .data
a: dq 0
b: dq 0
x: dq 0
y: dq 0
i: dd 0
j: dd 0
k: dd 0
l: dd 0
c: db 0
s: times 100 db 0
s1: times 100 db 0
s2: times 100 db 0
output: db "Case %lld: %s, %s",10,0
section .text
main:
open
xor r12, r12 ;ans
qget
mov rdx, rax
mov rax, 1000
sub rax, rdx
%macro f 1
xor rdx, rdx
mov rcx, %1
div rcx
add r12, rax
mov rax, rdx
%endmacro
f 500
f 100
f 50
f 10
f 5
f 1
qprintln r12
terminate
어셈블리는 재미있습니다. 감사합니다.