TIL (2020. 05. 15)

Shin Yeongjae·2020년 5월 15일
0

TIL

목록 보기
2/21
post-thumbnail

1. 프로그래머스 정수 제곱근 판별

문제설명

임의의 양의 정수 n에 대해, n이 어떤 양의 정수 x의 제곱인지 아닌지 판단하려 합니다.
n이 양의 정수 x의 제곱이라면 x+1의 제곱을 리턴하고, n이 양의 정수 x의 제곱이 아니라면 -1을 리턴하는 함수를 완성하세요.

제한 사항

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

입출력 예

nreturn
121141
3-1

입출력 예 설명

입출력 예#1

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

입출력 예#2

  • 3은 양의 정수의 제곱이 아니므로, -1을 리턴합니다.

나의 풀이

function solution(n) {
    let x = Math.sqrt(n);
    if (n % x === 0) {
        return Math.pow(x + 1, 2);
    }
    return -1;
}

먼저 변수 x를 임의의 양의 정수 n에 대한 제곱근으로 두고 그 수를 x로 나눈 나머지가 0일 경우 Math.pow 메소드를 이용해 제곱을 하여 리턴하도록 하였다. 결국 제곱수로 나누면 나누어 떨어지기 때문이다.


다른사람의 풀이

function solution(n) {
    const x = Math.sqrt(n);
    return x % 1 === 0  ? (x+1)**2 : -1;
}

나와 똑같은 로직이지만, 삼항연산자를 활용한 점 그리고 나머지를 판단하는 부분이 다르다. 딱 떨어지는 수를 1로 나눈 나머지는 항상 0이기 때문에 이외의 경우는 -1을 리턴하면 된다. 예를 들면, 3의 제곱근은 소수점이 나오기 때문에 1로 나눈 나머지가 0이 될 수 없다.
삼항연산자를 사용하니 훨씬 코드가 깔끔해 보이는데 삼항연산자를 활용할 수 있도록 더 열심히 해야겠다.


2. 팀원이 내준 문제

주어진 2차원 배열을 1차원 배열로 바꾼 후 각 요소를 반전시키는 문제이다.

나의 풀이

var arr1 = [[2, 1], [4, 3]];
var arr2 = [[3, 2, 1], [5, 4], [6]];
var arr3 = [[3], [4, 5], [6], [7], [8, 9, 10]];

function restoreArray(arr) {
  return arr.reverse().join(',').split(',').reverse();
}

// 결과값
// 1. ["1", "2", "3", "4"]
// 2. ["1", "2", "3", "4", "5", "6"]
// 3. ["3", "5", "4", "6", "7", "10", "9", "8"]

reverse 메소드를 이용하여 각 요소들을 반전시킨 후 join 메소드로 ','로 구분하여 문자열로 만든 후 다시 ','를 기준으로 배열로 변환 후 다시 reverse로 반전시켜 최종 값을 얻어냈다.


팀원의 풀이#1

function restoreArray(arr) {
    var returnArr = [];
    for (var i = 0; i < arr.length; i++) {
        var value = arr[i].reverse();
        for (var j = 0; j < arr[i].length; j++) {
            returnArr.push(value[j]);
        }
    }
    return returnArr;
}

이중 for문을 구성하여 풀었다. 먼저 빈 배열을 만든 후 arr의 length만큼 for문을 돌려 i번째 요소들을 반전시켜 value에 저장 후 다시 그 값의 length만큼 반복문을 돌려 빈 배열에 value에 저장된 요소들을 추가하였다. 두 번째 반복문에서 arr[i].length;를 value.length;로 바꿔서 적었으면 조금 더 가독성이 좋아지지 않을까 하는 생각을 조심스럽게 해본다..

팀원의 풀이#2

function restoreArray(arr) {
    var returnArr = [];
    var idx = 0;
    for (var i = 0; i < arr.length; i++) {
        for (var j = arr[i].length - 1; j >= 0; j--) {
            returnArr[idx] = arr[i][j];
            idx++;
        }
    }
    return returnArr;
}

첫 번째 코드와 로직은 거의 비슷한 것 같다. 대신에 reverse 메소드를 사용하지 않고 idx라는 임의의 인덱스를 변수로 선언한 후 시작점을 arr[i].length - 1 로 설정 해주면서 j 값이 감소하는 반복문을 통해 인덱스를 증가시키면서 요소들을 차례대로 넣어주었다. 역시 다른 사람들이 짠 코드를 보는게 도움이 되는 것 같다. 이런식으로도 짤 수 있구나 하고 깨달음을 얻게해준다.

profile
문과생의 개발자 도전기

0개의 댓글