프로그래머스 알고리즘 LV.1 - 정수 제곱근 판별

roadzmoon76·2022년 1월 29일
0

알고리즘

목록 보기
1/6

https://programmers.co.kr/learn/courses/30/lessons/12934

📕나의 풀이


  • 이유는 모르겠는데 위와같이 작성하니 8번줄의 제곱이 안먹힘. 여러가지 테스트를 해보니 array.indexOf를 사용해서 나온 수에는 연산자가 먹히지 않았음. 비쥬얼 스튜디오에서 했을땐 잘 먹혔음
  • ⭐️잘보니 10번줄 때문에 그렇게 나오는거였다 ㅎㅎ... 코드 배치 순서가 문제였다
  • 좀더 생각을 해보니 제곱근 판별을 하는데 제곱근 관련된 메소드를 쓴건 제곱근 판별 함수의 논리구조를 공부하는 측면에서 좋은 선택이 아니였던 것 같다.
function solution(n) {
    var answer;
    let integerArr = [0, 0];
    for (let i = 1; i <= Math.floor(Math.sqrt(50000000000000)); i++) {
        integerArr.push(i);
    }
    answer = integerArr.indexOf(Math.sqrt(n));
    if (integerArr.indexOf(Math.sqrt(n)) > 0) {
        answer = integerArr.indexOf(Math.sqrt(n)) ** 2;
    }
    return answer;
}

메소드도 너무 많이 사용했고, 주어진 조건범위 내의 수를 모두 계산하는 배열을 만들어서 코드의 속도면에서 상당히 비효율적인 것 같다

📘다른 사람 풀이


위 풀이를 보고 다시 적용해본 나의 풀이

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

위 풀이는 기존 나의 풀이보다는 n이 작다면 굳이 많은 연산을 하지 않아도되서 효율적이나 n이 커질수록 비효율적이게 됨

📘다른 사람 풀이 2


위 풀이를 보고 다시 적용한 나의 풀이

function solution(n) {
    switch(n % Math.sqrt(n)){
    case 0:
      return (Math.sqrt(n) + 1) ** 2;
    default:
      return -1
  }
}
  • 해당n의 경우에만 계산을 하면되서 속도가 가장 빨랐다
  • 또한 조건문 자체가 계산식이여서 훨씬 효율적이였던것 같다

📝정리

  • 내 풀이가 해당 문제가 요구하는 논리를 이미 구현해놓은 메소드를 사용하는건지 항상 생각해 보자
  • 항상 어떻게 하면 더 효율적인 코드인지를 생각해보자.
    • 내가 인자로 넣어주는 값만 해당 코드가 돌아가게 짜는 것이 효율적이다
profile
크론병걸린 자퇴생, 개발자되기

0개의 댓글