-
[네이버클라우드 캠프/2주차] 재귀메서드 (feat. BigInteger)네이버클라우드 캠프 | BE/Java 과제 2023. 4. 12. 10:46728x90
2주 차에는 정말 많은 내용을 배움과 동시에, 과제에서도 느낀 부분이 많았습니다.
이번 블로그에서는 재귀메서드를 생성하고 구현하는 것에 대해 정리해보려고 합니다.
❓재귀메서드를 이용하여 사용자가 입력한 숫자까지의 합을 구하세요.
static BigInteger infiniteAdd (BigInteger b)
문제를 풀기에 앞서, BigInteger는 어떤 역할을 하고 있을까요?
1. BigInteger
BigInteger는 자바에서 정수형을 다루는 클래스입니다.
int나 long이 표현할 수 있는 수의 범위를 넘어서는 아주 큰 정수 데이터도 처리할 수 있는 클래스입니다.
이러한 BigInteger는 불변성(immutable)을 갖고 있기 때문에 한 번 생성되면 값을 수정할 수 없습니다.
이에 따라 대신 새로운 BigInteger 객체를 생성하여 연산 결과를 반환할 수 있습니다.
2. 문제 풀이
public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.print("정수 입력 > "); int n = sc.nextInt(); BigInteger sum = infiniteAdd(BigInteger.valueOf(n)); System.out.println(sum); } static BigInteger infiniteAdd(BigInteger b) { if(b.equals(BigInteger.ONE)) { return BigInteger.ONE; } else { return b.add(infiniteAdd(b.subtract(BigInteger.ONE))); } } }
2-1. infiniteAdd 메서드
static BigInteger infiniteAdd(BigInteger b) { if(b.equals(BigInteger.ONE)) { return BigInteger.ONE; } else { return b.add(infiniteAdd(b.subtract(BigInteger.ONE))); } }
입력받은 BigInteger 객체가 1이라면 1을 반환하고,
그렇지 않으면 b-1을 인자로 재귀호출하여, b와 infiniteAdd(b - 1)의 합을 계산한 뒤 반환합니다.
long이나 int에서는 +, -, *, /와 같은 사칙연산 기호를 사용할 수 있지만,
BigInteger는 add(), substract(), multiply(), divide() 메서드를 사용하여 사칙연산을 진행할 수 있습니다.
따라서 아래의 코드만 풀어서 해석하도록 하겠습니다.
return b.add(infiniteAdd(b.subtract(BigInteger.ONE)));
현재의 BigInteger 값 b에서 BigInteger.ONE을 빼서 하나 작은 값을 생성하고
infiniteAdd 메서드를 다시 그 값으로 호출합니다. 이렇게 호출한 결과를 현재의 b와 더한 후 반환합니다.
🫶 자세한 풀이 순서는 아래를 참고하세요
1 BigInteger.ONE 1 2 b.subtract(BigInteger.ONE) b 에 b - 1 값을 대입 3 infiniteAdd(b.subtract(BigInteger.ONE)) infiniteAdd(b - 1) 4 b.add(infiniteAdd(b.subtract(BigInteger.ONE))) b 에 b + infiniteAdd(b - 1) 대입 5 return b.add(infiniteAdd(b.subtract(BigInteger.ONE))) b + infiniteAdd(b - 1) 반환(리턴) 재귀 메서드를 만드는 게 아직은 많이 어렵습니다..
아직은 원리를 이해하고 만든다기보다 이렇게 작성해 보고 저렇게 작성해 보다가 우연히 맞추게 되는 것 같습니다.
비슷한 문제를 많이 풀어보면 정확하고 빠르게 풀이할 수 있을 거라고 생각합니다. 그날까지.. 화이팅 🔥
'네이버클라우드 캠프 | BE > Java 과제' 카테고리의 다른 글
[네이버클라우드 캠프/3주차] 연속합이 가장 큰 두 수 구하기 (0) 2023.04.12 [네이버클라우드 캠프/3주차] 문자열 중 가장 많이 등장하는 문자 구하기 (0) 2023.04.12 [네이버클라우드 캠프/2주차] 반올림 하기 (0) 2023.04.11 [네이버클라우드 캠프/2주차] 클래스의 생성과 배열 관련 메서드 (1) 2023.04.11 [네이버클라우드 캠프/1주차] 배열 (feat.전화번호부) (0) 2023.03.22