http://euler.synap.co.kr/prob_detail.php?id=24
Skillist 설명---------------------------------------------------------------------------------
새벽 몇 시간 동안 재미있는 문제였습니다.
기본 개념 부분과 알고리즘 부분을 직접 작성하여 올립니다.
Skillist 코드---------------------------------------------------------------------------------
public static void main(String[] args){
int array[] = new int[]{0,1,2,3,4,5,6,7,8,9}; //작은 순서대로 숫자 초기화
int number = 1000000; //1000000번째 큰 숫자
int fact=1;
for(int i=1; i<array.length+1;i++){ //10! 계산
fact *= i;
}
for(int i=10;i>0;i--){
fact /= i; //i를 사용하여 순서대로 9!,8!,7!,...,2!,1!,을 만들어 준다.
int j = 0;
while( number > fact ){ //9!,8! 등 각 팩토리얼이 몇번 사용(마이너스) 되는지 확인을 위한 while문
j+=1;
number -= fact;
}
System.out.print(array[j]); //j번에 따라 해당 수 출력
for(int k=j;k<array.length-1;k++){ //사용한 변수 제거 후 배열 재배치
array[k] = array[k+1];
}
}
}
다시 공부---------------------------------------
//다시 공부하며 이해 안되는 부분이 있기 때문에 주석 설명 추가
public static void main(String[] arg){
int[] array={0,1,2,3,4,5,6,7,8,9};
int iWant = 1000000;
int fac = 1;
for(int i=2;i<10;i++){ //9팩토리얼 부터 계산
fac*=i;
}
for(int i=9;i>0;i--){
int where = 0;
while(iWant > fac){ //내가 알기 원하는 숫자가 fac(팩토리얼) 초과일때만 계산해야한다. 같을때 계산하면 클남
where +=1;
iWant -= fac; //나누기는 같을때도 나누기 때문에 -연산을 수행하며 초과 확인.
}
fac/=i;
System.out.print(array[where]); //숫자를 선택해서 출력
for(int j=where;j<array.length-1;j++){ //배열 앞으로 땡기기
array[j] = array[j+1];
}
}
System.out.print(array[0]); //나머지 숫자 출력
}
'코딩 테스트 > Project Euler @ kr' 카테고리의 다른 글
27) 연속되는 n에 대해 가장 많은 소수를 만들어내는 2차식 구하기 (0) | 2017.02.20 |
---|---|
25) 피보나치 수열에서 처음으로 1000자리가 되는 항은 몇 번째? (0) | 2017.02.18 |
23) 두 초과수의 합으로 나타낼 수 없는 모든 양의 정수의 합은? (0) | 2017.02.17 |
22) 영문 이름 점수 합계 구하기 (0) | 2017.02.17 |
21) 10000 이하 모든 친화수(우애수)의 합은? (0) | 2017.02.17 |