<문제 설명>
두 정수 left와 right가 매개변수로 주어집니다. left부터 right까지의 모든 수들 중에서, 약수의 개수가 짝수인 수는 더하고, 약수의 개수가 홀수인 수는 뺀 수를 return 하도록 solution 함수를 완성해주세요.
<입출력 예>
left | right | result |
13 | 17 | 43 |
24 | 27 | 52 |
<문제 풀이>
function solution(left, right) {
let res = [];
let temp = [];
let answer = [];
let result = 0;
for(let i = left; i <= right; i++){
for(let j = 1; j <= i; j++){
if(i % j===0){
res.push(j)
}
}
}for(let i = 0; i < res.length; i++){
if(res[i]===1){
if(temp.length>0){
answer.push(temp);
temp=[]
}
}temp.push(res[i])
}
if(temp.length>0){
answer.push(temp)
}
answer.forEach((a)=>{
result = a.length%2===0?result+a[a.length-1]
:result-a[a.length-1]
})
return result
}
문제는 left~right의 값의 약수가 짝수면 해당 값을 더하고,
홀수면 값을 빼서 result값을 구하는 것이다.
1. left~right의 약수 구하기
left부터 right까지 for문을 돌려서 각 값의 약수를 모두 담았다.
예를 들면, 13~17이면[1,13,1,2,7,14,1,3,5,15,1,2,4,8,16,1,17]이 담긴다.
이 배열을 res라고 하자.
2. 각 수의 약수를 배열 안에 작은 배열로 나누어 담기
이제 이 값을 1을 기준으로 1직전까지를 한 배열 안에 나누어 담는다.
[[1,13],[1,2,7,14],[1,3,5,15],[1,2,4,8,16],[1,17]] 이렇게 말이다.
res[i]의 값이 1이고, temp에 값이 있으면
answer에 temp에 있는 값을 담고 temp를 비운다.
그리고 res[i]의 값과 상관없이 res[i]를 temp에 담는다.
그러면 res를 기준으로 1이 담기고, 아직 temp에는 값이 없다.
그리고 if문을 지나서 13이 temp에 담긴다.
이렇게 하는 이유는, res를 예로 들면 반복문을 돌 때,
첫 1은 temp에 값이 없으니 일단 보류로 두고 res[2]에서 1이 나왔을 때,
이미 이 때는 1,13이 temp에 담겨있다.
그 때 temp 에 값이 있으면 해당되는 1,13이 answer에 담기고,
1,13이 담겨있던 temp는 빈 배열로 초기화되는 것이다.
그리고 마지막에 temp에 초기화와 push를 반복해서 1,17이 담길텐데,
이 값도 answer에 넣어주어야 하므로 temp에 값이 있을 때,
해당 temp를 answer로 더해준다.
여기까지가 [[1,13],[1,2,7,14],[1,3,5,15],[1,2,4,8,16],[1,17]] 로 만든 것이다.
3. 배열 안 배열의 요소 짝수/홀수 판별 후 더하기
다음은 result를 0으로 초기화한 뒤, 배열을 forEach로 돌면서
각 배열 안에 있는 배열 요소의 길이가 짝수일 경우 배열의 마지막 인덱스를 더하고,
홀수일 경우 result에서 마지막 인덱스를 뺐다.
<다른 풀이>
function solution(left, right) {
var answer = 0;
for (let i = left; i <= right; i++) {
if (Number.isInteger(Math.sqrt(i))) {
answer -= i;
} else {
answer += i;
}
}
return answer;
}
코드도 간결하고, 설명도 쉽다.
left~right값을 검사할 때, i의 제곱근이 정수일 경우, 약수의 갯수가 홀수라고 한다.
그래서 i의 제곱근이 정수인지 판별하여 맞으면 answer에서 i를 빼고,
틀리면(제곱근이 정수가 아닌 실수일 경우)answer에서 i를 더하는 것이다.
<코멘트>
자료구조와 알고리즘을 알아야 하는 이유는 내가 지금까지 배운 것들로 알기론,
가장 효율적인 방법을 찾아 데이터나 시간을 절약하는 것이라고 정의하고 있는데,
내장함수를 쓰는 것이 많은 데이터를 쓰겠지만
오류 없이 완벽하고, 혹여나 생기는 오류도 스스로 찾아내는 무결점의 ai의 시대가 도래하기 전까지는
가독성 또한 중요한 요소가 아닐까 라는 생각이 든다.
프로젝트를 진행하면서 라우터와 컨트롤러, 미들웨어 등
여러 api값 안에 여러 루트를 정리, 점검하면서 느껴지는게
이러한 구조로 작성한 의도 파악이다.
내가 아직 초보라 코드가 길고 가독성이 떨어지는 부분도 있겠지만,
개발자라는 직업이 존재하는 한 이 부분을 잘 고려하는 것이 중요하다는 생각이 물씬 들었다.
'개발 > 코딩테스트' 카테고리의 다른 글
[프로그래머스 | JavaScript] 문자열 다루기 기본 (0) | 2023.04.28 |
---|---|
[프로그래머스 | JavaScript] 부족한 금액 계산하기 (0) | 2023.04.27 |
[프로그래머스 | JavaScript] n의 배수 (0) | 2023.04.23 |
[프로그래머스 | JavaScript] 문자열 내림차순으로 배치하기 (0) | 2023.04.19 |
[프로그래머스 | JavaScript] 옹알이 (1) (0) | 2023.04.16 |