조합 예제 - 7

문제 분석

  • 사전에서 다루는 문자열이 az밖에 없다는 점에 착안해 접근해본다.

  • 핵심 아이디어

    • az의 개수가 각각 N, M개 일때 이 문자들로 만들 수 있는 모든 경우의 수는 N + M개에서 N를 뽑는 경우의 수 또는 N + M개에서 M개를 뽑는 경우의 수와 동일하다.

손으로 풀어보기

  1. 조합의 경우의 수를 나타내는 dp배열을 초기화하고, 점화식으로 값을 계산해 저장한다.

    • 조합 점화식

      • D[i][j] = D[i - 1][j] + D[i - 1][j - 1]

  2. 몇 번째 문자열을 표현해야 하는지를 나타내는 변수를 K라고 하고, 현재 자릿수에서 a를 선택했을 때 남아있는 문자들로 만들 수 있는 모든 경우의 수를 T라고 했을 떄, TK를 비교해 문자를 선택한다.

    • 문자 선택 기준

      • T >= K : 현재 자리 문자를 a로 선택

      • T < K : 현재 자리 문자를 z로 선택하고, K = K - T로 업데이트

    • 예제 입력 1 기준

      • a = 2, z = 2이고 a를 선택했을 때 나머지 문자열로 만들 수 있는 경우의 수는 D[3][2]다.(3은 남은 문자 총 개수, 2는 남은 z의 개수)

      • D[3][2] = 3 >= K(2)이므로 a 선택, z는 2개 남음

      • D[2][2] = 1 < K(2)이므로 z 선택, z는 1개 남음, K = K - T = 1로 업데이트

      • D[1][1] = 1 >= K(1)이므로 a 선택, z는 1개 남음

      • D[0][1] = 0 < K(1)이므로 z 선택

  3. 과정 2를 az의 문자들의 수를 합친 만큼 반복해 정답 문자열을 출력한다.

슈도코드

코드 구현 - 파이썬

코드 구현 - 자바

Last updated