걸음마부터 달리기
SWEA 1970 쉬운 거스름돈 본문
https://swexpertacademy.com/main/solvingProblem/solvingProblem.do
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
import java.util.*;
import java.io.*;
class Main {
static int T;
static int N;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
T = Integer.parseInt(br.readLine());
for (int i = 0; i < T; i++) {
N = Integer.parseInt(br.readLine());
int[] money = new int[8];
while(N>0){
if(N>=50000){
int need = N/50000;
money[0]=need;
N= N-(50000*need);
}
else if(N>=10000){
int need = N/10000;
money[1]=need;
N= N-(10000*need);
}
else if(N>=5000){
int need = N/5000;
money[2]=need;
N= N-(5000*need);
}
else if(N>=1000){
int need = N/1000;
money[3]=need;
N= N-(1000*need);
}
else if(N>=500){
int need = N/500;
money[4]=need;
N= N-(500*need);
}
else if(N>=100){
int need = N/100;
money[5]=need;
N= N-(100*need);
}
else if(N>=50){
int need = N/50;
money[6]=need;
N= N-(50*need);
}
else{
int need = N/10;
money[7]=need;
N= N-(10*need);
}
}
System.out.printf("#%d\n",(i+1));
for(int j=0; j<8; j++ ){
System.out.print(money[j]+" ");
}
System.out.println();
}
}
}
솔직히 이게 왜 타임아웃이 나는지 모르겠다.
아래의 최적화된 코드보단 당연히 오래 걸리겠지만
10 ≤ N ≤ 1,000,000 의 범위 안에서 + 한번의 테스트 케이스에 대해서 3초는 충분히 통과될거같은데...
______________________________________________________________________________
라고 생각했었는데 미쳤나보다.
N>0 일때 else문을 보면 need = N/10 이라서 need가 0이 되면서 무한루프에 빠진다.
import java.util.*;
import java.io.*;
class Main {
static int T;
static int N;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
T = Integer.parseInt(br.readLine());
for (int i = 0; i < T; i++) {
N = Integer.parseInt(br.readLine());
int[] money = new int[8];
while(N>=10){
if(N>=50000){
int need = N/50000;
money[0]=need;
N= N-(50000*need);
}
else if(N>=10000){
int need = N/10000;
money[1]=need;
N= N-(10000*need);
}
else if(N>=5000){
int need = N/5000;
money[2]=need;
N= N-(5000*need);
}
else if(N>=1000){
int need = N/1000;
money[3]=need;
N= N-(1000*need);
}
else if(N>=500){
int need = N/500;
money[4]=need;
N= N-(500*need);
}
else if(N>=100){
int need = N/100;
money[5]=need;
N= N-(100*need);
}
else if(N>=50){
int need = N/50;
money[6]=need;
N= N-(50*need);
}
else{
int need = N/10;
money[7]=need;
N= N-(10*need);
}
}
System.out.printf("#%d\n",(i+1));
for(int j=0; j<8; j++ ){
System.out.print(money[j]+" ");
}
System.out.println();
}
}
}
내가 짠 코드
이것은 최적화 시킨 코드이다.
import java.util.*;
import java.io.*;
class Main {
static int T;
static int N;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
T = Integer.parseInt(br.readLine());
for (int i = 0; i < T; i++) {
System.out.printf("#%d\n",(i+1));
N = Integer.parseInt(br.readLine());
int[] money = new int[] {50000 , 10000 , 5000 , 1000 , 500 , 100 , 50, 10};
for(int j=0; j<8; j++){
int count =0;
if((N/money[j])>0){
count = N/money[j];
N = N - count * money[j];
}
System.out.printf("%d ",count);
}
System.out.println();
}
}
}