https://www.acmicpc.net/problem/10162
문제 풀기 전 데이터 유형과 길이를 확인하고 조건을 다시 한 번 확인한다.
해당 문제의 데이터 유형은 정수로 10,000보다 작은 자연수이다. 구하고자 하는 것은 요리시간 T를 맞추기 위한 최소 버튼 조작 횟수로 A, B, C의 최소 버튼 횟수를 출력하는 것이다. 이 때 3개의 버튼으로 T를 맞출 수 없으면 -1을 출력한다.
첫 번째 풀이는 while문으로 t가 0이 아닐 때까지 반복하다가 t가 c보다 작은 경우 3개의 버튼으로 T를 맞출 수 없어 break문으로 반복문을 탈출하였다. 총 3개의 서브 태스크가 있었는데 첫 번째 내 풀이는 30점이었다. ㅋㅋㅋㅋㅋ
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int t = Integer.parseInt(br.readLine());
int a = 300;
int b = 60;
int c = 10;
int countA = 0;
int countB = 0;
int countC = 0;
while (t != 0) {
if (t >= a) {
t -= a;
countA++;
}
if (t >= b) {
t -= b;
countB++;
}
if (t >= c) {
t -= c;
countC++;
} else {
break;
}
}
if (t == 0) {
System.out.println(countA + " " + countB + " " + countC);
} else {
System.out.println(-1);
}
}
}
더 좋은 풀이를 찾아보다가 while문에서 t가 c보다 크거나 같을 때까지만 반복하고 그렇지 않으면 반복문을 탈출하는 풀이를 발견하였다. 게다가 삼항 연산자까지 사용해서 내 첫 번째 코드보다 훨씬 깔끔했다. (자주 안쓰다보니 생각이 잘 안난다.)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int t = Integer.parseInt(br.readLine());
int a = 300;
int b = 60;
int c = 10;
int countA = 0;
int countB = 0;
int countC = 0;
while (t >= c) { // t가 c보다 작은 경우 반복문 종료
if (t >= a) {
t -= a;
countA++;
} else if (t >= b) {
t -= b;
countB++;
} else if (t >= c) {
t -= c;
countC++;
}
}
System.out.println(t == 0 ? countA + " " + countB + " " + countC : -1);
}
}
또 다른 풀이를 찾아봤다. 단순하게 t에서 빼는 것만 생각했는데 나눗셈으로 구하는 방법도 있었다! 도대체 이런 풀이는 어떻게 생각하는거죠?
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int t = Integer.parseInt(br.readLine());
int a = 300;
int b = 60;
int c = 10;
int countA = 0;
int countB = 0;
int countC = 0;
if (t % c != 0) { // a,b,c의 합으로 t를 구할 수 없는 경우
System.out.println(-1);
} else {
countA = t / a; // 몫은 카운트
t %= a; // 나머지는 빼는 것보다 효율적임
countB = t / b;
t %= b;
countC = t / c;
System.out.printf("%d %d %d", countA, countB, countC);
}
}
}
당연히 빼기 연산보다 나눗셈 연산이 효율적이라고 생각했는데 메모리도 그렇고 시간도 오래 걸렸다. 백준 서버 시간인가