녕의 학습 기록

백준_1256 사전 (조합 순열) 본문

Algorithm/Algorithm 문제

백준_1256 사전 (조합 순열)

kjyyjk 2024. 4. 8. 02:14

거의 4시간 들여다본 문제..

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class BJ_1256_사전 {

    public static void main(String[] args) throws IOException {

        StringBuilder result = new StringBuilder();
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");

        int n = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(st.nextToken());
        long k = Long.parseLong(st.nextToken());

        long[][] d = new long[n + m + 1][n + m + 1];

        int i, j;
        for (i=0; i<n+m+1; i++) {
            d[i][0] = 1;
            d[i][1] = i;
            d[i][i] = 1;
        }

        for (i=3; i<n+m+1; i++) {
            for (j=2; j<i+1; j++) {
                d[i][j] = d[i-1][j-1] + d[i-1][j];
                if (d[i][j] > 1000000000) {
                    d[i][j] = 1000000001;
                }
            }
        }

        if (d[n+m][m] < k) {
            System.out.println(result.append(-1));
            return;
        }

        while(!(n==0 && m==0)) {
            if (d[n+m-1][m] >= k) { //a를 선택
                result.append('a');
                n--; //남은 a 개수
            } else { //z를 선택
                result.append('z');
                k -= d[n+m-1][m]; 
                m--;
            }
        }

        System.out.println(result);
    }
}

 

 

1256번: 사전

동호와 규완이는 212호에서 문자열에 대해 공부하고 있다. 김진영 조교는 동호와 규완이에게 특별 과제를 주었다. 특별 과제는 특별한 문자열로 이루어 진 사전을 만드는 것이다. 사전에 수록되

www.acmicpc.net