< 문제 >
-
개요 효진이는 멀리 뛰기를 연습하고 있습니다. 효진이는 한번에 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;
}
}