Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 58179f4

Browse files
committed
배수빈: [BOJ] 1256 사전_250124
1 parent 46fee42 commit 58179f4

File tree

1 file changed

+68
-0
lines changed

1 file changed

+68
-0
lines changed

‎BOJ/1000-5000번/SB_1256.java‎

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
import java.io.BufferedReader;
2+
import java.io.IOException;
3+
import java.io.InputStreamReader;
4+
import java.util.StringTokenizer;
5+
6+
public class SB_1256 {
7+
static int N, M, K;
8+
static long[][] dp;
9+
public static void main(String[] args) throws IOException {
10+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
11+
StringTokenizer st = new StringTokenizer(br.readLine());
12+
StringBuilder sb = new StringBuilder();
13+
14+
N = Integer.parseInt(st.nextToken());
15+
M = Integer.parseInt(st.nextToken());
16+
K = Integer.parseInt(st.nextToken());
17+
18+
dp = new long[N+1][M+1];
19+
20+
// dp배열 만들기
21+
dp[0][0] = 1; // 아무것도 못만드는 경우 1개
22+
for (int i = 1; i <= N; i++) { // a만으로 이루어진 경우
23+
dp[i][0] = 1;
24+
}
25+
for (int j = 1; j <= M; j++) { // z만으로 이루어진 경우
26+
dp[0][j] = 1;
27+
}
28+
29+
for (int i = 1; i <= N; i++) {
30+
for (int j = 1; j <= M; j++) {
31+
dp[i][j] = Math.min(dp[i - 1][j] + dp[i][j - 1], K); // a를 앞에 추가해서 만들기 + z를 앞에 추가해서 만들기
32+
}
33+
}
34+
35+
// K가 범위 벗어나면 -1
36+
if (dp[N][M] < K) {
37+
System.out.println(-1);
38+
return;
39+
}
40+
41+
// 사전순으로 문자열 만들기
42+
while (N > 0 && M > 0) {
43+
long tmp = dp[N - 1][M]; // a로 시작하는 문자열의 개수
44+
if (K <= tmp) { // K가 tmp(a로 시작하는 범위의 개수)에 속할경우
45+
N -= 1; // 현재 tmp에서 N=-1해서 다음 경우 살피기 (현재 자리값 고정, 다음 자리 확인)
46+
sb.append('a'); // a로 시작하기에 a붙이기
47+
} else { // K가 tmp보다 클 경우 z를 시작으로하는 범위에서 살피기
48+
M -= 1; // M=-1해서 다음 경우 살피기
49+
K -= tmp; // K에서 제외된 tmp값 빼주기
50+
sb.append('z'); // z로 시작하기에 z붙이기
51+
}
52+
}
53+
54+
// 남은 문자 처리
55+
while (N > 0) {
56+
sb.append('a');
57+
N--;
58+
}
59+
60+
while (M > 0) {
61+
sb.append('z');
62+
M--;
63+
}
64+
65+
System.out.println(sb);
66+
67+
}
68+
}

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /