[프로그래머스] Lv.0 홀짝에 따라 다른 값 반환하기
🔖 문제 설명
양의 정수 n
이 매개변수로 주어질 때, n
이 홀수라면 n
이하의 홀수인 모든 양의 정수의 합을 return 하고 n
이 짝수라면 n
이하의 짝수인 모든 양의 정수의 제곱의 합을 return 하는 solution 함수를 작성해 주세요.
⛔ 제한사항
- 1 ≤
n
≤ 100
📋 입출력 예
n | result |
7 | 16 |
10 | 220 |
🔖 입출력 예 설명
입출력 예 #1
- 예제 1번의
n
은 7로 홀수입니다. 7 이하의 모든 양의 홀수는 1, 3, 5, 7이고 이들의 합인 1 + 3 + 5 + 7 = 16을 return 합니다.
입출력 예 #2
- 예제 2번의
n
은 10으로 짝수입니다. 10 이하의 모든 양의 짝수는 2, 4, 6, 8, 10이고 이들의 제곱의 합인 22 + 42 + 62 + 82 + 102 = 4 + 16 + 36 + 64 + 100 = 220을 return 합니다.
🧾 기본 제공 코드
function solution(n) {
var answer = 0;
return answer;
}
🗳️ 직접 풀이한 코드
function solution(n) {
const isEven = (n) => {
return n % 2 === 0;
}
const sumEven = (e) => {
let total = 0;
for (let i = e; i > 0; i--) {
if (i % 2 === 0) {
total += (i ** 2)
}
}
return total;
}
const sumOdd = (e) => {
let total = 0;
for (let i = e; i > 0; i--) {
if (i % 2 !== 0) {
total += i;
}
}
return total;
}
return isEven(n) ? sumEven(n) : sumOdd(n);
}
알고 있는 범위 내에서 문제를 해결하기 위해 위와 같이 문제를 풀었다.
문제를 해결하면서 신경쓰려고 했던 부분이 있다.
바로 로직이 동작함에 있어서 단순히 문제 해결만을 위한 로직이 아니라
직관적인 함수명 네이밍으로 함수 내부 코드를 보지 않더라도 해당 함수가 어떤 목적을 가지고 동작할지에 대한 추측이 가능하도록 로직을 작성하고 싶었다.
이 생각이 가장 컸던 탓 때문인지 그 생각을 중심으로 코드를 작성하려고 한 거 같다.
늘 비슷한 고민을 하는 듯 하지만 문제를 해결하고 나면 항상 다음과 같은 생각을 한다.
- 지금 짠 코드보다 더 효율적으로 짤 순 없을까?
sumEven()
함수와sumOdd()
함수에서 중복으로 나타나는 코드들과 같이 이런 경우 어떻게 합치고 분류하면 직관적이면서 효율적으로 동작되도록 할 수 있을까?
라는 생각들을 하는데, 아직 쉽지가 않다.
풀이를 마친 후, 다른 사람들은 어떤 기발한 아이디어로 문제를 해결했을지 궁금해 확인해 봤다.
👨💻 다른 사람이 풀이한 코드
function solution(n) {
if(n % 2 === 1)
return (n + 1) / 2 * ((n + 1) / 2) ;
else
return n * (n + 1) * (n + 2) / 6;
}
보자마자 이게 무슨 코드인가 라는 생각이 들었다.
기가 막힌다 라는 생각이 들었다.
내가 작성한 코드와는 비교도 할 수 없을 만큼 단순해졌고, 직관적이어졌으며, 가독성 또한 좋아졌다.
어떤 규칙성을 가진 코드인지 궁금해 댓글을 확인해보니 이런 댓글이 있었다.
"n이 짝수일 때는 등차수열의 합 공식을 적용하였고, n이 홀수일 때는 자연수 거듭 제곱의 합을 구하는 공식을 적용한 것으로 보입니다."
라는 댓글이었다.
수학 공식을 이용한 것이다.
더 정확히는 홀수인 경우 혹은 짝수일 때 구해지는 값들간의 규칙을 이용한 풀이였다.
조금이나마 이해를 돕기 위해 홀수인 경우를 예로 들어보자.
// n이 1인 경우 => 1
// n이 3인 경우 => 1 + 3 = 4
// n이 5인 경우 => 1 + 3 + 5 = 9
// n이 7인 경우 => 1 + 3 + 5 + 7 = 16
라는 값이 도출된다. 정리하자면
n
이 1인 경우라면 1n
이 3인 경우라면 4n
이 5인 경우라면 9n
이 7인 경우라면 16
이렇게 1 / 4 / 9 / 16 이라는 값이 도출되는 것을 알 수 있다.
여기서 우리는 1 / 4 / 9 / 16 이라는 값이 몹시 눈에 익는 숫자들이라는 것을 알아차릴 수 있다.
중·고등학교 시절 수포자라 할지라도 한 번쯤은 외우거나 눈에 익히며 느꼈을 숫자들이다.
바로 1 과 2 와 3, 그리고 4의 제곱 값인 것을 알 수 있다.
(짝수인 경우는 각자 코드에 대입해보며 값이 어떻게 떨어지고 어떤 규칙을 지니는지 확인해보면 좋을 듯 하다 ㅎ..)
💬 마치며
다른 사람이 풀이한 코드를 보며 이해하면서 생각했지만 미처 생각지도 못했던 방식이었어서 머리에 돌을 한 대 맞은 듯한 느낌이었다.
문제를 해결함에 있어서 다양한 방식들이 존재한다.
하지만 폭넓게 생각하기 어렵다.
이번 문제를 통해 문제가 특정 규칙성을 띄는 것을 파악할 수 있다면 문제를 풀이할 때 수학 공식을 이용하면 더욱 효율적이고 수월하게 풀어나갈 수 있겠다는 것을 알게 되어 유익했다.
🔸 작성된 본문 내용 중 미흡한 부분이 있을 수 있습니다.
🔸 고칠 부분이나 추가되면 좋을 내용 댓글로 남겨주시면 완성도 높은 글을 만들어가는 데에 큰 힘이 됩니다. ☺️