클라이언트/ 서버/ 엔지니어 " 게임 개발자"를 향한 매일의 공부일지

메서드 6 - 완전수를 구하는 5단계 과정 실습 본문

프로그래밍 언어/자바

메서드 6 - 완전수를 구하는 5단계 과정 실습

huenuri 2024. 8. 13. 22:33

마지막 교시에 들은 수업을 정리해본다. 하나의 메인 함수에다 여러 개의 메서드를 만들어서 3개 이상의 문제를 풀어보았다. 마지막 한 문제는 완전수를 구하는 건데 스스로 풀어볼 시간을 주셨지만, 아직 풀이는 하지 않았다.
이 문제는 내일 이어서 할테니 그때 정리해보려고 한다.

사실 4교시 수업 내용은 조금 어려웠고 어디서부터가 해당 메서드 공간인지 구분하는 것도 쉽지 않았다. 그래도 꼭 오늘 복습해보고 싶었다. 그래야 내일 수업도 오늘처럼 잘 따라갈 수 있을 테니까.

그럼 문제를 다시 풀어보자!

 

지난 번에 이 문제를 풀다가 너무 어려워서 해결하지 못했다. 두 달이 지난 지금 늦었지만 복습을 진행해보기로 했다. 뭐든 시간이 지나면 알게 되는 것들이 있다.


 

 

 

메서드 실습 문제 풀기 

 

1. 두 수가 약수인지 확인하여 ture 또는 false를 반환하는 메서드 만들기

 

 

 

메인 함수에 변수의 값을 저장하고 어떤 함수를 만들지 모형을 구축한다. 그런 다음 메서드에 구체적인 함수의 내용을 만들어보는 것이다. 약수인지 아닌지 판단해야 하므로 매개변수는 있고 반환값은 boolean으로 받아주었다.

푸는 방식은 2가지가 있는데, 하나는 if문을 사용하는 것이고 다른 하나는 삼항연산자를 사용하는 것이다. 삼항연산자는 조금 이해가 되지 않았다.
약수가 되려면 큰 수에서 작은 수를 나누었을 때 나누어 떨어지면 된다. 그러한 식을 만들어서 조건문으로 구하면 된다.
이제 삼항연산자로 푸는 방식도 알 것 같다.

 

이 부분을 다음과 같이 줄일 수도 있다.

 

 

 

 

 

 


 

 

 

2. 약수를 구하는 메소드 만들기

약수를 일일이 하나하나 찍는 것이다. 코딩테스트로 약수를 구하는 문제를 풀어본 적이 있었는데 그때는 이해하기 어려웠으나 오늘 수업을 들으며 어느 정도 알게 되었다.

 

main

 

메서드

 

 

어떤 약수를 구할 건지 메인에서 담아주었고, 결과값을 저장할 변수를 하나 만들어주었다. 변수도 하나 저장하고..

이 부분을 메서드로 간단하게 바꾸어줄 수 있다.

 

 

 

이렇게 처음에 메인에서 호출한 10, 16, 24의 약수가 잘 출력이 되는 것을 확인할 수 있다. 수업 시간에는 이 부분까지는  다루지 않았다.  그리고 약수 앞에 어떤 약수인지 설명도 붙여주었다. 처음에는 이걸 어떻게 만드는지 고민이었는데 드디어 해결했다.


 

 

 

 

3. 약수의 합을 구하여 반환하는 메서드 만들기

 

 

main

 

 

메서드

 


 

 

 

num의 약수들의 합은 이전에 만들었던 약수를 구하는 메서드를 가져와서 사용했다. 그리고 시간복잡도를 사용하면 좀더 빠르게 연산을 할 수 있고 절반으로 시간을 줄일 수 있다.

지난 번에는 이 부분을 이해하지 못했으나 이제는 충분히 이해할 수 있다.

 

하지만 num을 더하면 값이 2배가 되므로 다시 원래대로 복귀해야 한다. 이렇게 하면 다음 과정에서 완전수 판별을 할 때 오류가 생긴다.

 

 


 

 

 

 

 

4. 완전수인지 판별하기

 

main

 

 

메서드

 

 

분명 완전수인데 계속해서 false만 나와서 그 이유를 찾아보았다. 알고보니 시간복잡도 부분에서 num을 더한 게 문제였다. 이로 인해 isPerfectNumber 메서드에서 비교하는 값이 실제 num의 두 배가 되어 버린다. 따라서 num이 완전수라 하더라도, getSumOfDivisors(num) - num == num이 성립하지 않아 항상 false를 반환하게 된다.

완전수일 경우에는 true가 된다.

 

 

완전수 28이 되자 true로 출력이 되고 있다.


 

 

 

 

5. 완전수 구하기

한 단계 한 단계를 밟아가는 것이 상당히 길고 복잡하다. 그래도 이제 딱 하나만 남아있으니 좀더 힘을 내보자! 4단계부터는 영상에 소리가 없어서 그냥 화면만 보고 추측하면서 이해하고 있다. 이 수업의 경우 소리가 없는 경우가 정말 많다. 그래서 불편할 때가 한두번이 아니었다.

 

 

main

 

 

메서드

 

start와 end 라는 두 개의 정수를 입력 받아 그 사이에 있는 숫자들 중 완전수만을 출력하고 있다. 만약 2, 3, 4가 완전수라면 그 숫자들이 공백으로 구분되어 출력되는 조건인데 이 부분을 for문으로 줄이면 다음과 같다.

 

 

 


 

4교시 학습 내용을 정리하며

이렇게 오늘 3시간 반에 걸쳐서 배운 내용을 정리해보았다. 거의 수업시간에 맞먹는 시간인데 처음으로 수업을 들은 즉시 정리해보는 거라 그럴 것 이다. HTML 수업은 내일 새벽에 학습일지를 정리하는 것이 더 좋겠다는 생각이 들었다.

남은 저녁 공부 시간에는 파이썬과 자바 학습을 이어가봐야겠다~

 

이건 두 달 전에 썼던 일지이고 오늘 학습을 마친 소감은 무척 뿌듯했다. 그때는 이해하지 못해서 쓰다가 말았는데 오늘 이 부분을 완성할 수 있어서 정말 좋았다. 다음날까지의 수업을 이어서 작성해보았다.