본문 바로가기
개발 기초 다지기

알고리즘 문제 (약수의 개수와 덧셈, 문자열 내림차순으로 배치하기)

by 너의고래 2024. 5. 30.
반응형

약수의 개수와 덧셈

두 정수 left와 right가 매개변수로 주어집니다. left부터 right까지의 모든 수들 중에서, 약수의 개수가 짝수인 수는 더하고, 약수의 개수가 홀수인 수는 뺀 수를 return 하도록 solution 함수를 완성해주세요.

 

제한사항

  • 1 ≤ left ≤ right ≤ 1,000

 

입출력 예

left right result
13 17 43
24 27 52

입출력 예 설명

입출력 예 #1

  • 다음 표는 13부터 17까지의 수들의 약수를 모두 나타낸 것입니다.
약수 약수의 개수
13 1, 13 2
14 1, 2, 7, 14 4
15 1, 3, 5, 15 4
16 1, 2, 4, 8, 16 5
17 1, 17 2

 따라서, 13 + 14 + 15 - 16 + 17 = 43을 return 해야 합니다.

입출력 예 #2

  • 다음 표는 24부터 27까지의 수들의 약수를 모두 나타낸 것입니다.
약수 약수의 개수
24 1, 2, 3, 4, 6, 8, 12, 24 8
25 1, 5, 25 3
26 1, 2, 13, 26 4
27 1, 3, 9, 27 4

 따라서, 24 - 25 + 26 + 27 = 52를 return 해야 합니다.

 

- 내가 푼 풀이

function solution(left, right) {
    var answer = 0;
    
    for(let i=left; i<=right; i++){
        let count = 0
    //약수의 개수를 구한다
    for(let j=1; j<=i; j++){
        if(i%j === 0 ){
            count++
        }
    }
    if(count % 2 == 0 ){
        answer += i
    } else {
        answer -= i
    }}
    
    return answer;
}

 

간단하게 for문을 통해 left와 right 사이의 값을 구하고

약수 개수를 찾기 위해 중첩 for문으로 그 숫자를 나눴을 때 나머지가 나오지 않는 수를 하나씩 더해주었다.

그리고 if 조건문을 통해 2로 나누었을 때 나머지가 나오지 않는 짝수 약수를 가진 수는 answer에 양수로 더해주고 아닐 경우 음수로 더해주었다.

 

이 문제를 풀며 가장 고민되었던 부분은 '약수를 어떻게 구할 것인가'였다.

한참을 고민하다 굳이 약수값이 무엇인지 하나씩 구할 필요가 없다는 것을 알게되었고,

약수가 나누어 떨어지는 수라는 점을 고려하여 간단하게 약수의 개수를 구해주었다.

 

 

 

- 다른 풀이

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 사이의 값을 for문을 통해 돌려

제곱근을 반환시켜, 이 값이 정수인지 확인했다.

'true'를 반환할 경우 홀수이기 때문에 마이너스를

'false'를 반환할 경우 짝수이기 때문에 플러스를 반환하여

answer에 모두 더해주었다.

  • Number.isInteger() : 주어진 값이 정수인지 확인하는 JavaScript 내장 함수
  • Math.sqrt(i) : i 제곱근을 반환

 

문자열 내림차순으로 배치하기

문자열 s에 나타나는 문자를 큰것부터 작은 순으로 정렬해 새로운 문자열을 리턴하는 함수, solution을 완성해주세요.
s는 영문 대소문자로만 구성되어 있으며, 대문자는 소문자보다 작은 것으로 간주합니다.

제한 사항

  • str은 길이 1 이상인 문자열입니다.

입출력 예

s return
"Zbcdefg" "gfedcbZ"

 

 

- 내가 푼 풀이

function solution(s) {
    var answer = '';
    
    answer = s.split('').sort().reverse().join('');
    
    return answer;
}

간단하게 문제에서 제시한 것을 함수를 통해 나열해주었다.

  • s 값을 배열 형태로 나누어준다
  • 오름차순으로 정렬해준다.
  • 내림차순으로 만들기 위해 뒤집어 준다.
  • 배열 형태를 다시 문자열로 합쳐 준다.

 

- 다른 풀이

function solution(s) {
    return s.split("").sort((a,b) => a<b ? 1:-1).join("")
}

내 식과 유사하지만

sort 비교문을 통해 내림차순을 바로 시켰다.

나는 sort 비교문에 대해 잘 모르기 때문에 정리를 해보려 한다.

 

sort 비교 구문

일반적인 오름차순 정렬 : (a, b) => a - b

이 식의 작동 방법은 아래와 같다.

  • a - b를 진행한다.
  • 0보다 작은 값: a가 b보다 앞에 있어야 합니다.
  • 0: ab의 순서를 바꾸지 않습니다.
  • 0보다 : a b보다 뒤에 있어야 합니다.

이렇게 하나씩 비교하여 오름차순 정렬을 진행한다.

 

위 식의 내림차순 정렬 sort((a, b) => a < b ? 1 : -1)

  • a가 b보다 작으면, a가 b보다 뒤에 있어야 하므로 1을 반환하여 a와 b의 순서를 바꿉니다.
  • 이 비교 함수는 일반적인 오름차순 정렬 (a, b) => a - b와는 반대로 작동
  • 그래서 a가 b보다 작을 경우 0보다 큰 값을 반환 해 순서를 바꾼다. (오름차순에서는 0보다 작은 값 반환 됨)

 

 

반응형

댓글