[경우의 수 - Medium]

< 문제 >

  • 개요 효진이는 멀리 뛰기를 연습하고 있습니다. 효진이는 한번에 1칸, 또는 2칸을 뛸 수 있습니다. 칸이 총 4개 있을 때, 효진이는 (1칸, 1칸, 1칸, 1칸) (1칸, 2칸, 1칸) (1칸, 1칸, 2칸) (2칸, 1칸, 1칸) (2칸, 2칸) 의 5가지 방법으로 맨 끝 칸에 도달할 수 있습니다.멀리뛰기에 사용될 칸의 수 n이 주어질 때, 효진이가 끝에 도달하는 방법이 몇 가지인지 출력하는 jumpCase 함수를 완성하세요.(20분)

  • 예상 결과 예상 결과는 하기 코드 실행시 예상되는 결과 값이다.

예를 들어 4가 입력된다면, 5를 반환해 주면 됩니다.

< 정답풀이 >

 public class Test08 {

	private static final String result = "결과 : %d'칸 이동 시 멀리뛰기 경우의 수 : %d";

	public static void main( String[] args ) {
		// 시작시간 기록
		long startTime = System.currentTimeMillis();

		// STEP.1. 1~N 칸까지 도달하는 방법의 수를 구한다.
		int num = 4;
		int cnt = getJumpcase( num );
		System.out.println( String.format( result, num, cnt ) );

		// 종료시간 기록
		long endTime = System.currentTimeMillis() - startTime;
		System.out.println( "소요시간 : " + endTime + "ms." );
	}

	/**
	 * <PRE>
	 * 1~N 칸까지 도달하는 방법의 수를 구한다.
	 * </PRE>
	 * 
	 * @return 도달하는 경우의 수
	 */
	public static int getJumpcase( int num ) {
		int cnt = 0;       // 결과값을 저장하기 위한 변수
		int inx = 1;       // 한번에 뛰는 칸
		int tempNum = num; // 연산을 위한 변수

		// 1~2칸만 뛸 수 있고, 남은칸보다 멀리 뛸 수 없다.
		while ( inx <= 2 && tempNum - inx >= 0 ) {

			// 1~2칸을 뛴다.
			tempNum -= inx;

			// 남은 칸이 0이면 다 뛴거다.
			if ( tempNum == 0 ) {
				cnt++;

			// 남은 칸이 0보다 크면 더 뛰어야한다.(재귀호출)
			} else if ( tempNum > 0 ) {
				cnt += getJumpcase( tempNum );
			}

			// 1~2칸을 뛰기 위해서 값을 초기화 한다.
			tempNum = num;

			// 한칸을 추가한다.
			inx++; 
		}
		return cnt;
	}
}