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

내일배움캠프 17일차 : 알고리즘 문제 (제곱근 판별, 내림차순으로 배치하기, 두 정수 사이의 값)

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

알고리즘 문제를 풀며 정리가 필요했던 문제를 정리한다.

 

 

<문제1> 정수 제곱근 판별

임의의 양의 정수 n에 대해, n이 어떤 양의 정수 x의 제곱인지 아닌지 판단하려 합니다.

n 양의 정수 x 제곱이라면 x+1 제곱을 리턴하고, n 양의 정수 x 제곱이 아니라면 -1 리턴하는 함수를 완성하세요.

 

제한 사항

  • n은 1이상, 50000000000000 이하인 양의 정수입니다.

입출력 예

n return
121 144
3 -1

입출력 예 설명

입출력 예#1
121은 양의 정수 11의 제곱이므로, (11+1)를 제곱한 144를 리턴합니다.

입출력 #2
3
양의 정수의 제곱이 아니므로, -1 리턴합니다.

 

- 내가 만든 코드

function solution(n) {
    var answer = 0;
    
    for(let x=1; (x*x) <= n; x++){
        if(n === x*x){
            answer = (x+1)*(x+1)
        } else{
            answer = -1
        };
    };

    return answer;
}

 

for문에 조건을 넣어줄 때 x는 양의 정수이기 때문에 1부터 시작하며, 제곱근을 판별하고있기때문에 x의 제곱이 n보다 작거나 같다는 조건을 넣어주었다. 그다음부터는 직관적인 코딩으로 구성하였다.

 

 

- 다른 풀이

function solution(n) {
    var answer = 0;
    let sqrt = Math.sqrt(n);
    if (sqrt % 1 !== 0) { // 나머지를 이용해 소숫점 판별, 제곱근이 아닐 경우
        answer = -1;
    } else {
        answer = Math.pow(sqrt+1,2); // 제곱근일 경우
    }
    return answer
}

Math.sqrt를 통해 x값을 let으로 sqrt로 정의내린다

if 조건문을 통해 x값이 양수가 맞는지를 1로 나눴을 때 나머지 값이 존재하는가로 판별

Math.pow를 사용하여 (x+1) 제곱을 리턴시킨다

  • Math.sqrt() : 숫자의 제곱근을 반환
    Math.sqrt(2); // 1.414213562373095
    Math.sqrt(9); // 3
  • Math.pow() : 밑의 거듭제곱 값을 반환
    Math.pow(7, 2); // 49
    Math.pow(7, 3); // 343

 

 

- 다른 풀이

function solution(n) {
    // 삼항 연산자를 이용한 풀이
    return Math.sqrt(n) % 1 == 0 ? Math.pow(Math.sqrt(n)+1,2) : -1
}

위 풀이를 삼항연산자로 표현했을 경우

 

 

 

<문제2> 정수 내림차순으로 배치하기

함수 solution은 정수 n을 매개변수로 입력받습니다. n의 각 자릿수를 큰것부터 작은 순으로 정렬한 새로운 정수를 리턴해주세요. 예를들어 n이 118372면 873211을 리턴하면 됩니다.

 

제한 조건

  • n은 1이상 8000000000 이하인 자연수입니다.

입출력 예

n return
118372 873211

 

 

- 내가 만든 코드

function solution(n) {
    var answer = 0;

    let arr = n.toString().split("").sort().reverse().join('');
    answer = Number(arr);
    
    return answer;
}

 

내 코드를 풀어가며 어려웠던 부분은 '.join('')' 이 메서드를 사용해야한다는 것을 인지하지 못했었다.

문자 배열인 상태를 바로 숫자형태로 만들 수는 없기 때문에 join() 메소드를 통해 하날로 합쳐준 후 수자형으로 바꿔주어야 한다.

  • Array.prototype.join() : 열의 모든 요소를 쉼표나 지정된 구분 문자열로 구분하여 연결한 문자열을 만들어 반환

 

- 다른 풀이

function solution(n) {
  const newN = n + "";
  const newArr = newN
    .split("")
    .sort()
    .reverse()
    .join("");

  return +newArr;
}

 

모두 동일한 풀이지만 'n'을 문자로 만들 때 '+ ""'을 사용했으며, 숫자형으로 만들 때는 +를 붙여주었다.

 

 

<문제3> 두 정수 사이의 값

두 정수 a, b가 주어졌을 때 a와 b 사이에 속한 모든 정수의 합을 리턴하는 함수, solution을 완성하세요.
예를 들어 a = 3, b = 5인 경우, 3 + 4 + 5 = 12이므로 12를 리턴합니다.

 

제한 조건

  • a와 b가 같은 경우는 둘 중 아무 수나 리턴하세요.
  • a와 b는 -10,000,000 이상 10,000,000 이하인 정수입니다.
  • a와 b의 대소관계는 정해져있지 않습니다.

입출력 예

a b return
3 5 12
3 3 3
5 3 12

 

 

- 내가 만든 코드

function solution(a, b) {
    var answer = 0;
    
    if(a > b) {
        for(let i = b; i<=a;i++){
            answer += i
        }
    } else if(a < b){
        for(let i = a; i <= b; i++ ){
            answer += i
        }
    } else {
        answer = a
    }
    
    return answer;

 

a와 b 중 어느 수가 더 클지 모르기 때문에 각 상황에 대한 조건문을 만들어주었다.

작은 수를 i 값의 시작점으로 두고 큰수까지 더하며 answer 값을 구했다.

 

 

- 다른 풀이

function adder(a, b){
    var result = 0
    //함수를 완성하세요
    return (a+b) * (Math.abs(a-b)+1) / 2;
}

 

내가 이 공식을 알지 못해 만들 수 없던 풀이

두 수 사이의 합을 구할 때 = (a + b) * ((절댓값 a-b) + 1) / 2

  • Math.abs : 주어진 숫자의 절댓값을 반환

 

- 다른 풀이

function solution(a, b) {
    if(a===b) return a;
    let small = a < b ? a : b;
    let big = a > b ? a : b;
    for(let i = small+1; i < big+1; i++) 
        small += i;
    return small;
}

 

삼항연산식을 통해 a와 b의 작은수와 큰 수를 정의해준 후 직접 작은 값에서 큰 값까지를 더해주는 풀이법.

 

 

 

 

반응형

댓글