문제 풀이/백준
[백준] 15989번. 1, 2, 3 더하기 4(JAVA)
27200
2024. 12. 11. 19:46
문제
https://www.acmicpc.net/problem/15989
풀이(22분)
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
for(int i = 0; i < n; i++){
System.out.println(check(Integer.parseInt(br.readLine())));
}
}
public static int check(int x){
if(x <= 3){
return x;
}
int count = 0;
// 중복 허용 조합 생성
for (int c = 0; c <= x / 3; c++) { // c는 3의 개수
for (int b = 0; b <= (x - 3 * c) / 2; b++) { // b는 2의 개수
int a = x - 3 * c - 2 * b; // a는 1의 개수
if (a >= 0) {
count++;
}
}
}
return count;
}
}
처음엔 이전의 1,2,3 더하기 문제처럼 dp를 생각했다. 하지만 n=10000까지라는 제한이 있는 문제에 이렇게 접근해도 되지 않을까 했다.
내가 이용한 것은 a + 2b + 3c = x의 부정방정식을 푸는 것이다.(중고딩 때 많이 풀었던 문제!!)
대략 c= 0일 때 b = x/2 정도의 연산을 가진다. 즉 최대 10000이어도 5000번의 연산으로 끝난다는 소리다.
그럼 c = 0 ~ 3333까지 갈 때 b는 계속 줄어든만큼의 연산만 수행하면 된다.
하지만 대충 말도 안 되게 계산해봐도 5000x3333 = 15,000,000의 연산이면 끝난다는 것을 알 수 있다.
즉!!! 너무 어렵게 생각하지 않고 그냥 풀어도 되는 문제다!!