검색결과 리스트
글
블로그 이사합니다.
My Story
2013/04/14 14:42
블로그 이사합니다.
새로운 주소는 sarojaba.com 입니다.
'My Story' 카테고리의 다른 글
| 블로그 이사합니다. (0) | 2013/04/14 |
|---|---|
| 10년(하) 오프닝데이 행사 포스터 (0) | 2010/11/07 |
| 삼성소프트웨어멤버십 2011년 상반기 신입회원 선발 공고 (0) | 2010/10/14 |
| 멤터 회원을 모집합니다. (3) | 2010/09/07 |
설정
트랙백
댓글
글
[안드로이드] 나 여기야
Portfolio
2012/05/13 17:42
설명: 메신저(마이피플, 카카오톡)을 통해 자신의 위치를 전송하는 앱
미리보기
다운로드: https://play.google.com/store/apps/details?id=com.sarojaba.imhere
'Portfolio' 카테고리의 다른 글
| [안드로이드] 나 여기야 (3) | 2012/05/13 |
|---|---|
| 네트워크 동기들 라이브 월페이퍼 (0) | 2011/06/25 |
| [영상처리] 히스토그램 관련 영상처리 (0) | 2009/04/10 |
| [영상처리] 컬러모델 변환 프로그램 (0) | 2009/04/09 |
설정
트랙백
댓글
글
정수 소인수 분해 풀이(동적계획법)
Algorithm/etc
2012/05/05 12:09
정수 소인수 분해 문제의 재귀 풀이: http://sarojaba.tistory.com/233
위 포스트에서 스마트 돌고래 님께서 동적계획법으로 풀어달라는 요청이 있었습니다. 동적계획법을 적용하기 좋은 문제라고 생각되어 적당히 풀어서 풀이를 올립니다.
사용 언어는 Java이고, 파일 입출력은 생략하였고, 샘플 케이스만 만족시켰습니다. 나름 충실히 주석 적어놓았습니만 궁금하신 부분은 언제든 질문하시기 바랍니다. 또한 많은 지적 부탁드립니다.
위키피디아에 소인수 분해 문제에 대한 다양한 알고리즘이 존재하였습니다. 시간이 된다면 공부해서 올리도록 하겠습니다.
main과 solve 메소드는 앞선 포스트의 코드와 내용이 동일합니다. factor 메소드만 보셔도 될듯합니다. 이해하기 쉽게 각 케이스별로 배열을 재계산하게 코딩하였지만 실제 사용한다면 모든 케이스가 배열을 공유하여 계산량을 줄일 수 있도록 전역으로 두시기 바랍니다.
###java
public class PrimeFactorUsingDynamic {
public static void main(String[] args) {
solve(45);
solve(12);
solve(67);
solve(100);
solve(200);
}
/**
* 문제를 푼다.
*
* @param input
* 입력값
*/
public static void solve(int input) {
// 소인수를 더한다.
int output = factor(input);
// 입력값과 계산값이 같으면 소수이다.
boolean isPrime = (output == input);
if (isPrime) {
System.out.println("Prime Number");
} else {
System.out.println(output);
}
}
/**
* 소인수의 합을 구한다. 단, 입력값이 소수인 경우 입력값과 출력값은 같다.
*
* @param n
* 정수 ex) 12 = 2*2*3
* @return 소인수의 합 ex) 7 = 2+2+3
*/
public static int factor(int n) {
// 계산된 값들을 저장할 배열.
// 0과 1은 빈칸으로 두고 사용하지 않는다.
int[] arr = new int[n + 1];
// 2부터 인자로 받은 숫자까지 순차적으로 계산해간다.
for (int i = 2; i < n + 1; i++) {
// 몫을 저장하기 위한 변수
int t = i;
// 몫이 1이라는 뜻은 계산이 끝났다는 의미이다.
while (t != 1) {
// 인수는 2부터 시작한다.
int f = 2;
// 정확히 나누어 떨어지지 않으면 인수를 하나씩 증가시킨다.
while (t % f != 0) {
f++;
}
// 나누어 떨어지는 인수로 나눈다.
t /= f;
// 혹시 이전에 미리 계산된 값이 있으면 사용한다.
if (arr[t] != 0) {
arr[i] = f + arr[t];
break;
}
// 인수를 더해서 저장한다.
arr[i] += f;
}
}
// 모든 계산이 끝나면 배열의 마지막 수가 입력값의 소인수를 모두 더한 값이다.
return arr[n];
}
}
'Algorithm > etc' 카테고리의 다른 글
| 정수 소인수 분해 풀이(동적계획법) (2) | 2012/05/05 |
|---|---|
| 정수 소인수 분해 (3) | 2012/05/04 |
| Code Jam Korea 2012 예선 라운드 A. 새로운 달력 (0) | 2012/02/28 |
| [Google Code Jam] Minimum Scalar Product (0) | 2012/02/10 |