230127 Extra Long Factorials와 함께 알아본 BigInt, BigInteger

샨티(shanti)·2023년 1월 27일
0

코딩테스트

목록 보기
26/35

매일 매일 하루 한 문제씩.
꾸준히 이어가는 코딩테스트 풀이 기록 ✅

해커랭크에서 medium 문제를 골랐는데 생각보다 쉽(?)다고 느꼈던 문제.
사실 쉽다기 보다는... 크게 고민하지 않고 풀 수 있는 문제라고 생각했다. 하지만 이런 문제가 아니라면 BigInt를 언제 또 이렇게 써보겠는가 싶기도 하고.

어쨌든, 꺾인 마음을 어서 추스리고 다시 일상으로 그리고 루틴을 찾아 열심히 달려야지.
간혹 내가 쳇바퀴 속 햄스터인가? 하는 생각이 들 때도 있는데 차라리 햄스터라도 되어 이 루틴을 미친듯이 반복이라도 하고싶다는 그런 미친 생각도...ㅎㅎ.

여튼. 각설하고 오늘은 간만에 자바와 자바스크립트 두 가지 언어로 풀어보았는데 각각의 언어에서 큰 수를 어떻게 활용하는지 간략하게 정리해보자.


문제 링크

Extra Long Factorials


Java

갠적으로 오늘 문제는 자바스크립트보다는 자바가 더 쉽게 풀린 게 아닌가 싶긴 하다.
아 물론, BigInteger 활용법은 사용하지 않으면 까먹을 것 같아서 자바스크립트와 함께 가장 아랫단에 간략히 정리하고 넘어가려 한다.

class Result {
    /*
     * Complete the 'extraLongFactorials' function below.
     *
     * The function accepts INTEGER n as parameter.
     */

    public static void extraLongFactorials(int n) {
    // Write your code here
    
    BigInteger accumulate = new BigInteger("1");
    
    for(int i = 1; i <= n; i += 1) {
        accumulate = accumulate.multiply(BigInteger.valueOf(i));
    }
    
    System.out.println(accumulate);

    }
}


Javascript

처음에 recursion으로 풀어보려고 낑낑대다가 고민하는 시간이 너무 길어지기만 하는 것 같아서 과감히 while과 for로 해결했다.
너무 한 방법에 집착한 나머지 시간을 초과하는건... 그리 좋지 않은듯.
나중에 쉬는 시간에나 더 고민하시고! ㅎㅎ 우선 되는 방법을 빠르게 찾자.

자바스크립트 1(while문 활용)

function extraLongFactorials(n) {
  let accumulate = BigInt(1);
  let number = BigInt(n);

  while (number > 0) {
    accumulate *= number;
    number -= BigInt(1);
  }

  console.log(String(accumulate));
}

자바스크립트 2(for문 활용)

function extraLongFactorials(n) {
  let totalValue = BigInt(n);

  for (let i = n - 1; i > 1; i -= 1) {
    totalValue *= BigInt(i);
  }

  console.log(String(totalValue));
}

BigInteger, BigInt

자바에서는 BigInteger, 자바스크립트에서는 BigInt라고 하는 소위 '큰 수'를 표현하는 방법.
사실 코딩테스트를 할 때 외에는 잘 만나보지 못했던 기능이기에 이렇게 나왔을 때 한번 정리하고 가는게 맞는 것 같아서 얕게마나 정리한다.

나중에 검색했을 때 쉽게 찾아보기라도 할 수 있도록 ㅎㅎ

1. 자바의 BigInteger

  • 무한의 정수가 들어갈 수 있는 가능성이 있을 떄 BigInteger 클래스 활용 가능
  • BigInteger 초기화를 위해서는 문자열을 인자값으로 넘겨주어야 함.
    => 결국 BigInteger는 우리가 흔히 생각하는 정수로 다뤄지는 것이 아니라 문자로 다뤄지는 것 아닐까?! 이에 따라 사칙연산 역시 기호(+, -, /, *)가 아닌 별도의 내장메서드를 통해 실행할 수 있다.
  • 선언
BigInteger bigNumber = new BigInteger("10000");
  • 사칙연산 내장메서드
    더하기: bigNumber1.add(bigNumber2),
    빼기: bigNumber1.subtract(bigNumber2),
    곱하기: bigNumber1.multiply(bigNumber2),
    나누기: bigNumber1.divide(bigNumber2),
    나머지(%): bigNumber1.remainder(bigNumber2)

2. 자바스크립트의 BigInt

  • 길이의 제약 없이 정수를 다룰 수 있게 해주는 숫자형
  • 스펙에 추가된지 얼마 안 된 문법으로 브라우저별 지원 여부 확인 필요
  • 정수 리터럴 끝에 n을 붙이거나 BigInt를 호출하면 문자열이나 숫자로 BigInt 타입의 값을 만들 수 있음
  • 일반 숫자와 섞어서 사용하려면 BigInt(), 또는 Number()를 사용해 명시적 형변환 필요
  • 활용예시(모던자바스크립트 튜토리얼 예시)
const bigint = 1234567890123456789012345678901234567890n;

const sameBigint = BigInt("1234567890123456789012345678901234567890");

const bigintFromNumber = BigInt(10); // 10n과 동일합니다.

오늘 풀면서 까다로왔던 부분이 바로 일반 숫자와 BigInt(eger)를 섞어서 계산해야 하는 부분이었다.
'이건 되지 않을까?' 하는 부분까지도 모두 명시적 형변환이 필요했던 게 의외라면 의외.

오늘도 이렇게 정리해보는 조그마한 지식. 그리고 코딩테스트.

쳇바퀴처럼 또 내일도 열심히 코테를 굴려보자!!!!!


참고링크

[Java] 큰 숫자(정수) 다루기 BigInteger 사용법 & 예제 총정리
모던자바스크립트 BigInt

profile
가벼운 사진, 그렇지 못한 글

1개의 댓글

comment-user-thumbnail
2023년 5월 19일

안녕하세요 혹시 해커랭크에서 알고리즘 문제 풀때 문제 초기화 버튼은 없는건가요?... 문제가 지워졌는데 되돌릴 방법이 없나 해서요 ㅠㅠ

답글 달기