int 타입 변수 n으로부터 임의의 값을 입력받아 n에 저장된 값의 약수를 모두 더해 반환하는 함수를 작성하는 것이다. solution을 확인하기에 앞서 약수에 대해 먼저 설명하자면, 사전적 의미로는 어떤 정수를 나누어 떨어지게 하는 0이 아닌 정수라고 한다. 다시 말해, 약수는 1부터 자기 자신(n에 저장된 어떤 값)까지의 값들 중 어느 값이라도 자기 자신을 나누어 떨어지게끔 한다면 그 값은 n의 약수라는 뜻이다. 이제 solution을 보며 설명해보도록 하겠다.
약수는 어떤 정수(n에 저장된 값)를 나누어 떨어지게 하는 0이 아닌 정수를 칭한다고 하였다. n이 12라고 가정할 때 1부터 12까지의 수들 중 12를 나누어 떨어지게 하는 값을 찾기 위해 for 반복문을 사용하여 1부터 12까지의 모든 값을 나머지 연산을 수행하게 했다. 이때 나머지가 0인 값들은 12를 나누어 떨어지게 하는 값이기 때문에 그 값을 0이 저장되어 있는 int형 변수 answer에 누적 덧셈을 하여 n의 모든 약수의 합을 구하였다. 이로써 약수의 합을 구하는 solution을 완성시켰다. 내가 처음 작성한 solution은 위의 것이었다. 나만의 solution을 낸 후에 학습 차원에서 다른 사람들의 좋은 풀이들을 보고는 하는데, 나의 solution과 틀은 같지만 효율적인 면에서 훨씬 좋은 코드를 발견했고, 이것을 생각하지 못한 나의 짧은 생각에 대해 큰 아쉬움을 토하게 되었다. 우선 그 solution부터 살펴보며 설명하도록 하겠다.
위의 solution과의 차이점을 5, 9번째 줄의 코드에서 확인할 수 있다. i가 1부터 n이 아닌 n/2까지 반복문을 수행하도록 하였다. 약수는 1부터 n까지의 모든 값을 따져봐야 하는데 왜 n/2까지만 수행해도 문제가 없는 것일까. 조금 생각해보면 당연한 것이다. A라는 수를 B라는 수로 나눈다고 하면 몫은 무조건 나올 것이다. 그 몫이 정수 중 0을 제외한다면 제일 작은 것은 1일 것이다. 몫이 1이 나오려면 자기 자신으로 나누어야 된다. 그럼 1 다음으로 작은 것은 2인데 2는 '자기 자신 / 2'로 나누어야 나오는 값이다. 즉 어떤 수일지라도 자기 자신을 제외한 가장 큰 약수는 자기 자신을 2로 나눈 값일 것이다. 그렇기 때문에 i를 1부터 n/2까지로 반복을 수행하는 것이다. 문제의 제한 사항은 n이 0부터 3000까지인데, 3000이라고 해도 3000번을 수행하여 약수를 찾을 것을 1500번만 수행하여 약수를 찾을 수 있게 되기 때문에 훨씬 효율적이게 된다. 이렇게 반복문을 수행하면 answer에는 자기 자신을 제외한 모든 약수들이 누적 합산이 되어있을 테고 마지막에 answer에 자기 자신인 n을 더하여 반환해주면 solution은 완성이 된다.
========== 느낀 점 ==========
두 번째 solution을 보고 난 후, 좀 아쉬운 마음이 들었다. 충분히 생각할 수 있는 코드였다는 생각에서였다. 항상 좀 더 효율적인 코드를 작성하기 위해 노력을 하고 나름의 효율적인 코드를 작성했다고 하더라도 더 나은 코드들은 여태껏 항상 존재했다. 아직 나 스스로가 코딩 경험이 적기 때문에 효율적인 면까지 잡기에는 부족할 것이라고 생각은 하지만 효율적인 코드를 짜기 위해 노력을 하는 것과 하지 않는 것에는 분명한 차이가 존재할 것이고 그 차이는 점차 벌어지게 될 것이며 격차는 나아가 나의 경험이 될 것이라 믿어 의심치 않는다. 아직은 너무나도 쉬운 단계의 코드들이지만 훗날 꼭 많은 개발을 하길 염원하고 있다.
그날까지 파이팅!!!!!
으아아아아아아아!!!!!!!!!!!
'알고리즘' 카테고리의 다른 글
프로그래머스 - 문자열을 정수로 바꾸기 (0) | 2022.02.07 |
---|---|
프로그래머스 - 문자열 다루기 기본 (0) | 2022.02.04 |
프로그래머스 - 정수 내림차순으로 배치하기 (0) | 2022.01.26 |
프로그래머스 - 평균 구하기 (0) | 2022.01.25 |
프로그래머스 - 핸드폰 번호 가리기 (0) | 2022.01.24 |