프로그래머스 Lv.1 문제풀이(5)

programming·2023년 2월 2일
0
post-thumbnail

오늘부로 알고리즘 주차가 끝이 났다. 일주일 넘게 코딩 테스트 문제를 푸느라 진짜 너무 힘들었다.

일단 풀 수 있는 문제가 많이 없었을 뿐더러 다른 사람의 풀이를 이해하려고 하는 과정조차 어려웠기 때문이다.

그래도 많이 발전된 점은 문제를 보고 for문을 써야겠다, if문을 써야겠다, 배열에 집어 넣어야겠다 등..
문제를 어떻게 풀어야 할 지 대략적인 느낌이 온다는 것과, 많은 풀이를 보면서 자바스크립트 내 다양한 함수 기능을 공부해볼 수 있었다는 점이다.

100문제 정도 공부한 것 같은데, 한 문제 한 문제 내가 주석 달아가면서 정리했던 부분들을 다시 한번씩 보면서, 내 것으로 만들고 하루에 한 문제씩 풀면서 감을 키워나가야겠다.

내일부터 주특기 입문주차가 시작된다. 드디어 Node.js를 제대로 배워보는 시간이라서 너무 설레임과 동시에 어떤 고난이 찾아올지 살짝 두렵기도 하다.

항해99라는 이름 하에 정말 매 주차가 폭풍우가 몰아치고, 죽으면 안 된다는 마음으로 헤쳐나가고 있는 중이기 때문이다.

이제 벌써 4주차다. 시간이 언제 이렇게 갔지? 라는 생각이 들 정도로 매우 빠르게 흘러가고 있다. 지나간 시간에 대해 후회하지 않도록 마주하는 주차도 더 열심히 해보도록 하자. 파이팅!

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

풀이 코드

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

풀이 과정

  1. n이 어떤 수의 제곱인지를 확인하기 위해 x라는 변수에 n의 제곱근 값을 넣는다.

  2. x가 정수인지 판단하려면 정수의 성질 중 1로 나누었을 때 나머지가 0.
    n이 121이라면, x는 11이니까 1로 나누어 떨어진다.
    그러나 n이 3이라면, x는 루트3이니까 1로 안나누어 떨어진다.

  3. 만약 n의 제곱근이 정수이면, x + 1의 제곱을 리턴하고,

  4. 그게 아니면 -1을 리턴한다.

프로그래머스 Lv1. 제일 작은 수 제거하기

풀이 코드

function solution(arr) {
    let min = arr[0];
    let minIndex = 0;
    
    if(arr.length > 1) {
        for(let i = 1; i < arr.length; i++) {
            if(arr[i] < min) {
                min = arr[i];
                minIndex = i;
            } 
        }
        arr.splice(minIndex, 1);
    } else return [-1];
    return arr;
}

풀이 과정

  1. arr의 길이에 따라 return하는 값이 다르므로 이를 if 조건문으로 먼저 나누어준다.
  • arr의 길이가 1보다 클 때 : 가장 작은 수를 제거한 배열 return
  • arr의 길이가 1보다 작을 때 : [-1] return
  1. arr 내에서 가장 작은 수를 찾아 제거
  • [ 4, 3, 2, 1 ]가 주어졌다고 했을때, 가장 첫번째 숫자인 4를 기준으로 반복문을 돌릴 것이기 때문에, 변수 min에 arr[0]인 4를 넣어두고 시작.
  • 첫번째 수인 4와 두번째 수인 3를 비교해 더 작은 수를 min으로 바꾸어준다. 이와 같은 과정을 각 자리수마다 반복해주는 반복문을 만들어준다.
  • 가장 작은 수의 index를 찾아 splice()로 잘라내줄 것이기 때문에, i가 몇번째가지 돌았는지 minindex로 알 수 있게 해준다.
    splice( , , )함수에서 첫 번째 인자 - 시작 인덱스 / 두 번째 인자 - 몇 개의 값을 삭제할지? / 세번째 이상부터는 추가할 값들.

프로그래머스 Lv1. 콜라츠 추측

풀이 코드

function solution(num) {
    
    for(let i = 0; i < 500; i++) {
        if(num !== 1) {
            if(num % 2 === 0) {
                num /= 2;
            } else {
                num = num * 3 + 1;
            }
        } else {
            return i;
        }
    }
    return -1;
}

풀이 과정

  1. n=1일때까지 필요한 과정을 거쳐서 만들고, 그 과정을 몇번 거쳤는지 반환하는 문제.

  2. 반복문 안에서는 num이 1이 아닐때와 1일때로 나누어준다.

  3. 먼저 조건문으로 1이 아니라면, 짝수,홀수인지 판단하여 2로 나누거나, 3으로 곱하고 1을 더한다.

  4. 만약 1이라면(1이 아닌거의 아닌거) 그대로 i를 리턴한다.

  5. 반복문을 다 돌아도 1을 못 만들었다면 -1을 리턴한다.

profile
개발 기록 일지

0개의 댓글