가장 작은 수는 DP로 구하고, 가장 큰 수는 그리디 관점에서 구한다.
1. dp 배열 초기화
String[] dp = new String[101];
Arrays.fill(dp, String.valueOf(Long.MAX_VALUE));
dp[2] = "1";
dp[3] = "7";
dp[4] = "4";
dp[5] = "2";
dp[6] = "6";
dp[7] = "8";
dp[i]
는 성냥개비가 i
개일 때 가장 작은 수이다.2. dp 배열 채우기
String[] arr = {"", "", "1", "7", "4", "2", "0", "8"};
for (int i = 8; i <= 100; i++) { //성냥개비 개수
for (int j = 2; j <= 7; j++) { //숫자를 표현하는 데 성냥개비 최소 2개 ~ 최대 7개 필요
String original = dp[i];
String newNum = dp[i - j] + arr[j];
//자릿수가 애초에 작은 경우
if (original.length() < newNum.length()) continue;
//자릿수가 적거나, 자릿수는 같고 비교했을 때 더 큰 경우
if (original.length() > newNum.length() || original.compareTo(newNum) > 0) {
dp[i] = newNum;
}
}
}
i
개 되는 다양한 조합을 살펴본다.0
이 가능하기 때문에 성냥개비 6개로 0
을 만들어야 한다. (arr[6] = "0"
)3. 테스트 케이스 반복 후 결과 출력
int tc = Integer.parseInt(br.readLine());
while (tc-- > 0) {
int n = Integer.parseInt(br.readLine());
String min = dp[n];
String max = (n % 2 == 0)
? "1".repeat(n / 2)
: "7" + "1".repeat((n - 3) / 2);
sb.append(min).append(" ").append(max).append("\n");
}
System.out.print(sb);
dp
배열에서 구한다.1
이 성냥개비 2개로 최소 성냥개비 개수이다.1
을 만드는데 모두 소진해서 최대한 자리수를 많게 만든다.7
이 성냥개비 3개를 사용하기 때문에 남은 3개로는 숫자 7
을 만드는 데 사용할 수 있다.1
또는 1, 7
로만 이루어진다.DP
로 가능하겠지만 규칙과 원리를 찾아서 한번의 계산식으로 구할 수 있다.O(N)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
public class BJ_3687 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
String[] dp = new String[101];
Arrays.fill(dp, String.valueOf(Long.MAX_VALUE));
dp[2] = "1";
dp[3] = "7";
dp[4] = "4";
dp[5] = "2";
dp[6] = "6";
dp[7] = "8";
String[] arr = {"", "", "1", "7", "4", "2", "0", "8"};
for (int i = 8; i <= 100; i++) { //성냥개비 개수
for (int j = 2; j <= 7; j++) { //숫자를 표현하는 데 성냥개비 최소 2개 ~ 최대 7개 필요
String original = dp[i];
String newNum = dp[i - j] + arr[j];
//자릿수가 애초에 작은 경우
if (original.length() < newNum.length()) continue;
//자릿수가 적거나, 자릿수는 같고 비교했을 때 더 큰 경우
if (original.length() > newNum.length() || original.compareTo(newNum) > 0) {
dp[i] = newNum;
}
}
}
int tc = Integer.parseInt(br.readLine());
while (tc-- > 0) {
int n = Integer.parseInt(br.readLine());
String min = dp[n];
String max = (n % 2 == 0)
? "1".repeat(n / 2)
: "7" + "1".repeat((n - 3) / 2);
sb.append(min).append(" ").append(max).append("\n");
}
System.out.print(sb);
}
}
dp = [""] * 101
for i in range(101):
dp[i] = str(10**18)
dp[2] = "1"
dp[3] = "7"
dp[4] = "4"
dp[5] = "2"
dp[6] = "6"
dp[7] = "8"
dp[8] = "10"
arr = ["", "", "1", "7", "4", "2", "0", "8"]
for i in range(2, 101):
for j in range(2, 8):
original = dp[i]
new_num = dp[i - j] + arr[j]
if len(original) < len(new_num):
continue
if len(original) > len(new_num) or original > new_num:
dp[i] = new_num
t = int(input())
ans = []
for _ in range(t):
n = int(input())
min_val = dp[n]
max_val = "1" * (n // 2) if n % 2 == 0 else "7" + "1" * ((n - 3) // 2)
ans.append(f"{min_val} {max_val}")
print("\n".join(ans))