[JS] 양꼬치

2023. 5. 2. 08:59코딩테스트

1. 문제설명


머쓱이네 양꼬치 가게는 10인분을 먹으면 음료수 하나를 서비스로 줍니다. 양꼬치는 1인분에 12,000원, 음료수는 2,000원입니다. 정수 n과 k가 매개변수로 주어졌을 때, 양꼬치 n인분과 음료수 k개를 먹었다면 총얼마를 지불해야 하는지 return 하도록 solution 함수를 완성해보세요.

제한 조건

  • 0 < n < 1,000
  • n / 10 ≤ k < 1,000
  • 서비스로 받은 음료수는 모두 마십니다.

입출력 예

n k result
10 3 124,000
64 6 768,000

2.해결


function solution(n, k) {
  const sheep = 12000 * n;
  const drink = 2000 * (n / k - parseInt(n / 10));
  let defaultPrice = sheep + drink;

  return defaultPrice;
}

기본 가격에 n인분을 곱해서 기본 가격을 미리 만들었다.
하지만 음료수는 10인분 당 1개의 음료수는 서비스로 나가기 때문에 가격에 추가하지 않는다.
여기서는 parseInt로 10인분 기준으로 나눈 값을 제외하고 계산을 한다.
Number를 사용하면 소수점도 같이 나오지만 parseInt를 사용하면 소수점 자리는 버리고 정수만 출력한다.
5인분을 먹었다면 0.5 가 나오겠지만 parseInt로 정수만 받아오면 0이기 때문에 값을 뺄일은 없다.

3. 다른분들의 풀이방법


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

다른 분들은 Math.floor() 를 사용하신 분도 계셨다.
사실 parseInt와 동일하게 작동을 하다보니 어떤 함수를 가져다 쓰느냐의 차이라고 느꼈다.
하지만 '틸트'연산자를 사용하신분이 게셔서 틸트 문법에 대해서 찾아보았다.

기본적으로 틸트 연산자를 사용하게 되면 내부적으로 32비트 정수로 변환한 뒤 NOT연산자를 실행한다.
틸트 연산자는 Math.floor() 와 같이 소숫점을 버린다.
작성하신 코드를 해석해보면

function solution(n, k) {
    // n = 64; k = 3;

    k-=~~(n/10);
    // k에 n/10 한 값을 소수점을 버리고 값을 가지고있겠다.

    if (k < 0) k = 0;
    // k가 만약 0보다 작으면 k는 0을 가지고있겠다.

    return n*12000+k*2000;
    // n을 양꼬치가격만큼 곱하고 k와 음료수 가격을 곱한 다음 두 값을 더한다.

    // output : 768,000
}

parseInt,Math.floor,~~ 모두 같은 방법이라고 생각한다.
하지만 다른사람의 코드를 보다가 틸트문법을 보았을때 그걸 이해하고 넘어갈 수 있어야한다
앞으로 동일한 상황이 주어졌을때 틸트 문법을 사용해봐야겠다.

'코딩테스트' 카테고리의 다른 글

[JS] 삼각형의 완성조건(1)  (0) 2023.05.03
[JS] 짝수 홀수 개수  (0) 2023.05.02
[JS] 문자열 앞의 n 글자  (0) 2023.05.01
[JS] 문자열 곱하기  (0) 2023.05.01
[JS] 문자열 내 p와 y의 갯수  (0) 2023.05.01