가쟤의 해변일기 🐳

프로그래머스 JS 코딩테스트 준비 시작 ! 본문

코딩 테스트 in JS

프로그래머스 JS 코딩테스트 준비 시작 !

바닷가쟤 2023. 8. 1. 21:39

오늘 처음 코딩 테스트를 준비하기 시작했다. 

백준은 node.js라서 프로그래머스에서 자바스크립트로 준비하기로 했다.

단계별로 살펴보는데, 2-3단계는 알고리즘을 활용해서 이케이케.. 하는 ..! 

그래서 왕 초보인 나는 0단계부터 시작하기로 했다!

그래서 0단계 문제를 많이 (양치기) 풀어봤고, 1단계도 한 문제 껴있다! (막 어렵진 않았던 문제였지만)

그래도 풀면서 익숙해졌고 매우 재밌다(아직까진 그런데 너무 어려워지면 난 몰라)

수학을 잘 못하긴 하지만 그렇다고 안 될건 없으니까 열심히 해보자


두 수의 나눗셈

물결 연산자 (~~)

function solution(num1, num2) {
    return ~~(num1/num2*1000);
}

double tilde: not의 기능을 하는 비트 연산자이다. 10진수 5(16비트 2진수 0000000000000100)에 tilde를 적용하면 -6(16비트 2진수 1111111111111011) 이며 이 과정에서 소수점은 버려지게 된다. -6에 다시 tilde를 적용하면(double tilde, ~~5라고 표기) 다시 정수 5로 돌아오게 되어 결과적으로 Math.floor()와 같은 기능을 하게 된다. 이는 특정 브라우저에서 Math.floor()나 parseInt보다 빠른 퍼포먼스를 보여줄 수 있으나, 유지보수 하는 사람의 입자에서 문맥의 이해에 어려움이 있을 수 있다.

그 외 풀이

Math.floor, trunck, parseInt, 비트 연산자(<<)

Math.floor 와 parseInt의 차이점

Math.floor는 소수점을 만났을 때 '내림'한 정수값을 반환하고 parseInt는 소수점을 만났을 때 소수점 부분을 버린 정수값만 반환합니다. 양수일 때는 이 부분이 눈에 띄지 않지만 음수일 경우 같은 수에도 다른 결괏값이 나올 수 있으므로 주의해야 합니다.

 


각도기

.filter()

function solution(angle) {
    return [0, 90, 91, 180].filter(x => angle>=x).length;
}
function solution(angle) {
    return angle < 90 ? 1 : angle === 90 ? 2 : angle < 180 ? 3 : 4;
}

switch/case를 써도 된다.


짝수의 합 ✨

오래 걸린 이유: for문의 정확한 사용법을 몰랐다. for문 내에서 return을 하려고 했다.

-내 풀이-

function solution(n) {
    let num = 0
    
    for(let i = 0; i <= n; i+=2){
        num += i
    }
    return num
}

[스터디] 순서의 합

function solution(num_list, n) {
    const arr1= num_list.slice(n)
    const arr2 = num_list.slice(0, n)
    return arr1.concat(arr2)
}

걸린 시간 3분 내

slice, concat 활용

push, 전개연산자, splice, unshift 활용 가능

function solution(num_list, n) {
  num_list.unshift(...num_list.splice(n));
  return num_list;
}function solution(num_list, n) {
    return num_list.slice(n).concat(num_list.slice(0,n));
}
function solution(num_list, n) {
  num_list.unshift(...num_list.splice(n));
  return num_list;
}

[스터디] 배열 만들기1

-내 코드-

function solution(n, k) {
    let arr = []
    for(let i = 1; i <= n; i++) {
        if (i % k === 0) {
            arr.push(i);
        }
    }
    return arr
}

5분 정도 걸린 것 같다

i = 0으로 설정해서 배열에 [0, …]로 시작되어 .shift(), .split() 등등으로 없애보려 했었는데 i = 1로 고치니까 바로 통과

.push()로 배열에 i 들을 넣어준다.

배열의 요소 추가/삭제 차이

추가

.push() : 배열의 끝에 요소를 추가

.unshift() : 배열의 앞쪽에 요소를 추가

.splice(시작위치, 삭제할 것, 추가할 요소…)

 

삭제

.pop() : 마지막 요소를 제거

.shift() : 맨 앞 요소를 제거

.splice(시작위피, 삭제할 요소 길이, 추가할 요소…)

delete arr[1] : 요소는 그대로 존재하고 값만 삭제


[스터디] 핸드폰 번호 가리기 (1단계)

function solution(phone_number) {
    // const endNum = phone_number.slice(-4)
    const startNum = parseInt((phone_number.slice(0, -4)).length)
    return '*' * startNum
}

왜 “*” * startNum이 안되는거지… (위 코드는 시도하다 실패한..!)

 

-내 코드- (성공한 코드)

function solution(phone_number) {
    const startNum =  "*".repeat((phone_number.slice(0, -4)).length)
    const endNum = phone_number.slice(-4)
    return startNum.concat(endNum)
}

-다른사람 풀이-

const solution = n => [...n].fill("*",0,n.length-4).join("")

문자열 n 을 배열로 바꾸고, 배열의 첫 번째 부터 마지막에서 4번째 전 배열 크기 만큼 * 로 채워라. 이 후에 join 하여 string으로 반환하라.


배열의 평균값

처음엔 for문으로 풀려고 했는데 [i]이게 에러가 나서… forEach로 변경

-내 코드-

function solution(numbers) {
    let sum = 0
    numbers.forEach(num => {
        sum += num;
    })
    return sum / numbers.length
}

-다른사람 풀이-

function solution(numbers) {
    var answer = 0;
    for(i of numbers) {
        answer += i
    }
    return answer / numbers.length;

}

for of 사용 !

reduce를 사용하는 문제였다….


양꼬치

-내 코드-

function solution(n, k) {
    const sheep = 12000
    const can = 2000
    let total = n * sheep + k * can
    
    if (n >= 10) {
        return total - can * Math.trunc(n / 10)
    } else {
        return total
    }
}

Math.trunc 써서 성공!

 

-다른사람 풀이-

function solution(n, k) {
    k-=~~(n/10);
    if (k < 0) k = 0;
    return n*12000+k*2000;
}
728x90