오늘의 코딩테스트 한줄 - 제곱수 판별하기

Edwin·2023년 2월 4일
0
post-thumbnail

제곱수 판별하기

프로그래머스, 제곱수 판별하기

문제설명 : 어떤 자연수를 제곱했을 때 나오는 정수를 제곱수라고 합니다. 정수 n이 매개변수로 주어질 때, n이 제곱수라면 1을 아니라면 2를 return하도록 solution 함수를 완성해주세요.

풀이(1) : 144, 제곱수 임으로 return 1
풀이(2) : 976, 제곱수가 아니기에 return 2

01 나의 풀이 살펴보기 (실패)

function solution(n) {
  for(let i=0; i<100; i++) {
    if(i*i == n) {
      var ii = i
    }
  }
  console.log(n==ii*ii ? 1:2)
  return n==ii*ii ? 1:2
}

테스트 10번 가운데 7번만 되었음으로, 3번의 불일치코드가 있어서 실행되지 못했다. 이건 구글링하면 그냥 정답만 있을 뿐, 이해에 대한 부분이 없어서 현재로서는 풀어보지 못하겠다. 다만 나의 시도를 살펴보자. codepen에서 테스트했을 때는 잘 되었는데, 모르겠다.

먼저, 반복문 codepe에서 반복문은 100까지만 되는 것 같다. 그래서 101이 매개변수로 주어지면, 1번부터 100번까지, 144이 매개변수로 주어지면 44부터 143까지 실행되기에, 100까지만 설정하였다.

둘째, 반복문의 조건문을 보면 i가 100이 될 때까지 실행되면서, i * i 가 제곱수로 들어오는 변수와 일치되면 해당되는 i를 변수 ii에 담게 하였다. 예를 들어 n 이 4라면, 2가 담겨질 것이고, n 이 9라면 3이 담겨질 것이다. 그러나 만약 제곱수가 아니라면 false 이기 때문에 작동하지 않게 될 것이다.

셋째, return 을 보면 변수ii를 다시 n과 비교시켜 값이 맞으면 1을 그렇지 않으면 2를 return 하도록 조건부 삼항 연산자를 통해서 기록했다. 결과는 70%만 정답이었다.

02 나의 풀이 살펴보기 (성공)

function solution(n) {
  for(let i=0; i<1000000; i++) {
    if(i*i == n) {
      var ii = i
    }
  }
  console.log(n==ii*ii ? 1:2)
  return n==ii*ii ? 1:2
}

왜 안 될 것일까? 재미삼아서, for(let i=0; i<100; i++)을 for(let i=0; i<1000000; i++) 으로 수정해 보았다. 되었다?!!

이유는 n에 제한되어 있던 조건 때문이었다. 아래의 조건이 문제에 있었다.

제한사항 1 ≤ n ≤ 1,000,000

일단은 내 힘으로 풀었으니까. 잘했다.

03 다른 풀이 살펴보기, Math.sqrt(), isInteger()

function solution(n) {
  console.log(Number.isInteger(Math.sqrt(n)) ? 1 : 2)
  return Number.isInteger(Math.sqrt(n)) ? 1 : 2
}

solution(8)

풀이를 보니, Math.sqrt(n) ? 1 : 2 는 내가 처음 작성했던 코드였다. 문제를 보니 isInteger() 메소드가 있고, 해당 메소드 안에서 제곱근(Math.sqrt) 메소드 작성되었으며, 해당 메소드가 다시 형변환 하여 숫자로 변경된 것에 대하여, 조건부 삼항 연산자가 기록된 것을 본다.

그렇다면, isInteger() 는 무엇이고, 이를 왜 다시 형변환 하여 숫자로 변경해 주었을까? 이는 추후에 살펴보자.

사용법은 아래와 같다.

console.log(Number.isInteger(0));
console.log(Number.isInteger(-100));
console.log(Number.isInteger(0.1));
console.log(Number.isInteger("String"));

위의 이미지는 작성한 코드에 대한 결과를 콘솔에 찍은 것이다. isInteger() 메소드는 숫자열 관련 메소드 중에 하나로, 인수의 값이 정수인지 아닌지를 반환해주는 값이다. 전달된 값이 정수이면 true를, 그 이외의 값은 false로 반환한다. 그러기에 소수점도 false로 표기한다.

1) 다른사람의 풀이를 읽어보자. 첫번째는 함수의 매개변수로 들어온 수가 어떤 숫자의 제곱인지 확인해보자.

console.log(Math.sqrt(4));
console.log(Math.sqrt(5));
console.log(Math.sqrt(8));
console.log(Math.sqrt(9));

2) Math.sqrt()Math.pow(n, m)의 차이

  • Math.pow(n, m) (2,2)는 2를 두번 제곱하여 4가 되고, (2,3)은 2를 세번 제곱하여 8이 된다. (2,4)는 네변 제곱하여 16이 될 것이다. 이렇게 변환된 값을 제곱근이라고 하는데,
  • Math.sqrt()는 이를 반대로 분해하여 해당 제곱근이 어떤 숫자의 제곱인지를 반환한다.

3) isInteger() 2번을 통해서 반환된 값이 정수이면 true, 소수이면 false로 반환된 값에 대해서 조건부 삼항 연산자를 통해서 true라면 1을, false라면 2를 결과로 반환한다.

profile
신학전공자의 개발자 도전기!!

0개의 댓글