CodeGym /Java Blog /๋ฌด์ž‘์œ„์˜ /๊ณ„์Šน์„ ์œ„ํ•œ ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ
John Squirrels
๋ ˆ๋ฒจ 41
San Francisco

๊ณ„์Šน์„ ์œ„ํ•œ ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ

๋ฌด์ž‘์œ„์˜ ๊ทธ๋ฃน์— ๊ฒŒ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค
์˜ค๋Š˜ ์šฐ๋ฆฌ๋Š” ๊ณ„์Šน๊ณผ ๊ณ„์Šน์„ ์ฐพ๋Š” ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์•Œ๊ณ  ์ž‘์—…ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๋Š” ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ๊ธ€์Ž„, ์‹œ์ž‘ํ•˜์ž. n!์œผ๋กœ ํ‘œ์‹œ๋˜๋Š” ์ˆซ์ž n์˜ ๊ณ„์Šน์€ 1์—์„œ n๊นŒ์ง€์˜ ๋ชจ๋“  ์ž์—ฐ์ˆ˜์˜ ๊ณฑ(๊ณฑ์…ˆ) ๊ฐ’์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค(์ˆ˜ํ•™ ์ง€์‹์„ ์ƒˆ๋กญ๊ฒŒ ํ•ฉ์‹œ๋‹ค).
1! = 1 2! = 1 * 2 = 2 3! = 1 * 2 * 3 = 6 4! = 1 * 2 * 3 * 4 = 24 5! = 1 * 2 * 3 * 4 * 5 = 120
๊ทธ๋ฆฌ๊ณ  0์— ๋Œ€ํ•œ ์ž‘์€ ๊ทœ์น™์ด ํ•˜๋‚˜ ๋” ์žˆ์Šต๋‹ˆ๋‹ค.
!0 = 1
6์˜ ์ฐจ์ด๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด! ๊ทธ๋ฆฌ๊ณ  4!:
6!-4! = 1โ‹…2โ‹…3โ‹…4โ‹…5โ‹…6 - 1โ‹…2โ‹…3โ‹…4 = 720 - 24 = 696
์ด๊ฒƒ์ด ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ๊ตฌํ˜„๋  ๋•Œ ์–ด๋–ป๊ฒŒ ๋ณด์ด๋Š”์ง€ ๋ด…์‹œ๋‹ค. Java์—์„œ ๊ณ„์Šน ๊ณ„์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ณ„์Šน ํ”„๋กœ๊ทธ๋žจ์˜ ์ผ๋ฐ˜ ์†”๋ฃจ์…˜

๋‹ค์Œ์€ ๋ฃจํ”„๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ„๋‹จํ•œ ๊ณ„์Šน ํ”„๋กœ๊ทธ๋žจ์ž…๋‹ˆ๋‹ค.

class FactorialExample{  
 public static void main(String args[]){  
  int i,fact=1;  
  int number=7;// our number to do the necessary calculations in class Factorial    
  for(i=1;i<=number;i++){    
      fact=fact*i;    
  }    
  System.out.println("Factorial of "+number+" is: "+fact);    
 }  
}
์ฝ˜์†”์˜ ์ถœ๋ ฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
7์˜ ๊ณ„์Šน: 5040
๊ทธ๋ฆฌ๊ณ  ์ •๋ฆฌ๋ฅผ ์œ„ํ•œ ๋˜ ํ•˜๋‚˜์˜ ์˜ˆ:

public static int getFactorial(int f) {
  int result = 1;
  for (int i = 1; i <= f; i++) {
     result = result * i; // finding factorial of number using loops
  }
  return result;
}
์—ฌ๊ธฐ์„œ ์–ด๋ ค์šด ๊ฒƒ์€ ์—†์Šต๋‹ˆ๋‹ค. ์ „๋‹ฌ๋œ ์ˆซ์ž๋ฅผ ๋ฃจํ”„์˜ ํฌ๊ธฐ๋กœ ์‚ฌ์šฉํ•˜๊ณ  f์— ๋„๋‹ฌํ•  ๋•Œ๊นŒ์ง€ ๋ชจ๋“  ์ด์ „ ์ˆซ์ž๋ฅผ ๊ณฑํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฉ”์ธ์—์„œ:

System.out.println(getFactorial(6) - getFactorial(4));
์ฝ”๋“œ๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋ฉด ์›ํ•˜๋Š” ๊ฒฐ๊ณผ์ธ 696์„ ์–ป๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์žฌ๊ท€ ์†”๋ฃจ์…˜

์žฌ๊ท€๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ์ž์‹ ์„ ํ˜ธ์ถœํ•  ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•์„ ์žฌ๊ท€ ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์›์น™์ ์œผ๋กœ ๋‘ ๋ถ€๋ถ„์œผ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.
  1. ์ข…๋ฃŒ ์กฐ๊ฑด โ€” ์ข…๋ฃŒ ์กฐ๊ฑด์ด ์ถฉ์กฑ๋˜๋ฉด ๋ฉ”์„œ๋“œ๋Š” ์ž์‹ ์„ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์„ ์ค‘์ง€ํ•˜๊ณ  ๊ฐ’์„ ์ „๋‹ฌํ•˜๊ธฐ ์‹œ์ž‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ ์ข…๋ฃŒ ์กฐ๊ฑด์ด ์—†์œผ๋ฉด StackOverflowError ๋ฅผ ์–ป์„ ๋•Œ๊นŒ์ง€ ๋ฉ”์„œ๋“œ๊ฐ€ ๋ฐ˜๋ณต์ ์œผ๋กœ ์ž์‹ ์„ ํ˜ธ์ถœํ•˜๋Š” ๋ฌดํ•œ ๋ฃจํ”„๋ฅผ ๊ฐ–๊ฒŒ ๋ฉ๋‹ˆ๋‹ค .
  2. ์ƒํ™ฉ์— ํ•„์š”ํ•œ ๋…ผ๋ฆฌ์™€ ์žฌ๊ท€ ํ˜ธ์ถœ์ด ํ•„์š”ํ•˜์ง€๋งŒ ์ž…๋ ฅ ๊ฐ’์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค.
Java์—์„œ ๊ณ„์Šน์„ ์ฐพ๋Š” ๊ฒƒ์€ ์žฌ๊ท€๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์˜ ์™„๋ฒฝํ•œ ์˜ˆ์ž…๋‹ˆ๋‹ค.

public static int getFactorial(int f) { // finding factorial of number using recursive solution
  if (f <= 1) {
     return 1;
  }
  else {
     return f * getFactorial(f - 1);
  }
}
์žฌ๊ท€ ์ข…๋ฃŒ ์กฐ๊ฑด์€ 1์— ๋„๋‹ฌํ•  ๋•Œ์ž…๋‹ˆ๋‹ค. ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ 1์ด ์•„๋‹ˆ๋ฉด ํ˜„์žฌ ๊ฐ’์— ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•œ ๋‹ค์Œ ์žฌ๊ท€ ํ˜ธ์ถœ์˜ ๊ฒฐ๊ณผ๋ฅผ ๊ณฑํ•ฉ๋‹ˆ๋‹ค(ํ˜„์žฌ ๊ฐ’์—์„œ 1์„ ๋บ€ ๊ฐ’์„ ์ „๋‹ฌํ•จ).

์ŠคํŠธ๋ฆผ ์†”๋ฃจ์…˜

Java์˜ ์ŠคํŠธ๋ฆผ ๊ธฐ๋Šฅ์— ์ต์ˆ™ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ƒˆ๋กœ๊ณ ์นจํ•˜๋ ค๋Š” ์‚ฌ๋žŒ์€ ์—ฌ๊ธฐ์—์„œ ์ •๋ณด๋ฅผ ์ฝ์œผ๋ฉด ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค .

public static int getFactorial(int f) { // finding factorial of number using Stream 
  if (f <= 1) {
     return 1;
  }
  else {
     return IntStream.rangeClosed(2, f).reduce((x, y) -> x * y).getAsInt();
  }
}
์—ฌ๊ธฐ์„œ๋Š” int ๊ฐ’์˜ ์ŠคํŠธ๋ฆผ์œผ๋กœ ์ž‘์—…ํ•  ๋•Œ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ํŠน์ˆ˜ IntStream ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ŠคํŠธ๋ฆผ์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์ •์  rangeClosed ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฉ”์„œ๋“œ๋Š” 2์—์„œ f๊นŒ์ง€์˜ ๊ฐ’์„ 1์”ฉ ์ฆ๋ถ„ํ•˜์—ฌ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์œผ๋กœ reduce ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  ๊ฐ’์„ ๊ฒฐํ•ฉํ•ฉ๋‹ˆ๋‹ค. ๋ณด๋‹ค ๊ตฌ์ฒด์ ์œผ๋กœ, ๊ฐ’์„ ๊ฒฐํ•ฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ ํ„ฐ๋ฏธ๋„ getAsInt ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒฐ๊ณผ ๊ฐ’์„ ์–ป์Šต๋‹ˆ๋‹ค.

BigInteger ์‚ฌ์šฉ

Java์—์„œ BigInteger ํด๋ž˜์Šค๋Š” ์ˆซ์ž, ํŠนํžˆ BIG ์ˆซ์ž๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ์ž์ฃผ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ int ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ ์†์‹ค ์—†์ด ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ๊ณ„์Šน์€ 31์ž…๋‹ˆ๋‹ค. ๊ธด ๋ฐ์ดํ„ฐ ์œ ํ˜•์˜ ๊ฒฝ์šฐ ์ตœ๋Œ€ ๊ณ„์Šน์€ 39์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ณ„์Šน 100์ด ํ•„์š”ํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”? ์ด์ „ ์†”๋ฃจ์…˜์„ BigInteger์— ์ ์šฉํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.๊ณ„์Šน์„ ์œ„ํ•œ Java ํ”„๋กœ๊ทธ๋žจ - 2

์ผ๋ฐ˜ ์†”๋ฃจ์…˜


public static BigInteger getFactorial(int f) { // finding factorial of number using BigInteger
  BigInteger result = BigInteger.ONE;
  for (int i = 1; i <= f; i++)
     result = result.multiply(BigInteger.valueOf(i));
  return result;
}
์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋™์ผํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์„œ๋Š” BigInteger์˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. BigInteger.ONE ์€ ์‹œ์ž‘ ๊ฐ’ 1์ด๊ณ , multiply() ๋Š” ์ด์ „ ๊ณ„์Šน ๊ฐ’๊ณผ ํ˜„์žฌ ์ˆซ์ž๋ฅผ ๊ณฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์žฌ๊ท€ ์†”๋ฃจ์…˜


public static BigInteger getFactorial(int f) {
  if (f <= 1) {
     return BigInteger.valueOf(1);
  }
  else {
     return BigInteger.valueOf(f).multiply(getFactorial(f - 1));
  }
}
์†”๋ฃจ์…˜์˜ ์ผ๋ฐ˜์ ์ธ ๋…ผ๋ฆฌ๋Š” BigInteger ์ž‘์—…์„ ์œ„ํ•ด ์ผ๋ถ€ ๋ฉ”์„œ๋“œ๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ๋‹ค๋Š” ์ ์„ ์ œ์™ธํ•˜๋ฉด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ŠคํŠธ๋ฆผ ์†”๋ฃจ์…˜


public static BigInteger getFactorial(int f) {
  if (f < 2) {
     return BigInteger.valueOf(1);
  }
  else {
     return IntStream.rangeClosed(2, f).mapToObj(BigInteger::valueOf).reduce(BigInteger::multiply).get();
  }
}
๋ชจ๋“  ๊ฒƒ์ด ๋ณธ์งˆ์ ์œผ๋กœ ๋™์ผํ•˜์ง€๋งŒ BigInteger๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Stream ํด๋ž˜์Šค๋Š” ์šฐ๋ฆฌ์—๊ฒŒ mapToObj ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•˜๋Š”๋ฐ, ์šฐ๋ฆฌ๋Š” ๊ณฑํ•˜๊ธฐ ๋ฉ”์„œ๋“œ ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ int ๊ฐ’์„ BigInteger๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค (๊ทธ๋ฆฌ๊ณ  get()์€ ์„ ํƒ์  ๋ž˜ํผ ์—์„œ ๊ฐœ์ฒด๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค ). ์ธ์ˆ˜ 100์œผ๋กœ ์ด ์„ธ ๊ฐ€์ง€ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ  ์˜ฌ๋ฐ”๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
9332621544394415268169923885626670049071596826438162146859296389521759999322991560894146397615651828625369792082722375825 1185210916864000000000000000000000000
์ฝ”๋ฉ˜ํŠธ
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION