옷가게 할인 받기
머쓱이네 옷가게는 10만 원 이상 사면 5%, 30만 원 이상 사면 10%, 50만 원 이상 사면 20%를 할인해줍니다.
구매한 옷의 가격 price가 주어질 때, 지불해야 할 금액을 return 하도록 solution 함수를 완성해보세요.
function solution(price) {
return Math.floor(price >= 500000 ? price-price/5 : price >= 300000 ? price-price/10 : price >= 100000 ? price-price/20 : price);
}
처음에 10만원 미만의 경우를 생각하지 못하고 price >= 100000 && price-price/20
으로 제출했다가 틀렸길래 왜 틀렸나 했다. 😂
그리고 나는 위와 같이 price/5 = 20% | price/10 = 10% | price/20 = 5% 로 계산했는데
price * 0.2 = 20% | price * 0.1 = 10% | price * 0.05 = 5% 가 더 직관적인 것 같다.
function solution(price) {
const discount = price < 100000 ? 0 : price < 300000 ? price / 20 : price < 500000 ? price / 10 : price / 5;
return Math.floor(price - discount);
}
어떤 사람은 위와 같이 코드를 작성했던데 가독성이 좋다고 생각한다. 코드만 봐도 ‘변수 discount는 가격에 따라 할인되는 금액이구나’를 알 수 있을 것 같다.
그런데 코드를 실행해보니 내가 작성한 코드의 실행 속도가 더 빨랐다.
‘가독성 좋은 코드 vs 실행 속도가 빠른 코드 중 어떤 코드가 좋은 걸까?’ 라는 의문이 들었다. 그래서 찾아봤다.
그렇다면 나는 이 문제의 답을 아래와 같은 코드로 작성하는 것이 가장 좋은 것 같다.
function solution(price) {
const discount = price >= 500000 ? price*0.2 : price >= 300000 ? price*0.1 : price >= 100000 ? price*0.05 : 0);
return Math.floor(price - discount);
}
+맨 처음 코드로 답을 제출했을 때, 처음으로 15점을 받았다. (그 전엔 대부분 3점을 받았다) 프로그래머스 코딩 테스트 점수 산출법이 궁금해 찾아보니
코딩 테스트의 경우 [정확성]과 [효율성]으로 구분해서 점수를 계산합니다.
[정확성] 테스트는 지원자가 제출한 코드가 문제 지문을 충분히 구현하고 있는지를 평가하며
[효율성] 테스트는 코드의 시간복잡도(코드가 문제를 해결하는데 걸린 시간이 충분히 빠른지)를 테스트합니다.
라고 한다.
삼각형의 완성 조건
선분 세 개로 삼각형을 만들기 위해서는 다음과 같은 조건을 만족해야 합니다.
가장 긴 변의 길이는 다른 두 변의 길이의 합보다 작아야 합니다.
삼각형의 세 변의 길이가 담긴 배열 sides이 매개변수로 주어집니다. 세 변으로 삼각형을 만들 수 있다면 1, 만들 수 없다면 2를 return하도록 solution 함수를 완성해주세요.
function solution(sides) {
sides = sides.sort((a, b) => a - b);
return answer = sides[2] < sides[0]+sides[1] ? 1 : 2;
}
Array.sort
를 이용하여 배열 안의 숫자를 오름차순으로 정렬하고, 3번째에 있는 숫자(sides[2])가 나머지 숫자보다 작을 경우 1을, 클 경우 2가 return 되도록 만들었다.
약수 구하기
function solution(n) {
var answer = [];
for (let i = 1; i <= n; i++) {
if(n % i === 0 ) answer.push(i);
}
return answer;
}
어제 ‘약수의 합’에서 배웠던 방식을 응용해 약수를 구해봤다.
배열의 유사도
두 배열이 얼마나 유사한지 확인해보려고 합니다. 문자열 배열 s1과 s2가 주어질 때 같은 원소의 개수를 return하도록 solution 함수를 완성해주세요.
function solution(s1, s2) {
const combine = s1.concat(s2);
return combine.length - [...new Set(combine)].length;
}
나는 concat으로 두 배열을 합친 뒤, 합쳐진 배열의 길이에서 중복이 사라진 배열의 길이를 뺐다. (중복은 ES6 문법인 set을 이용해 없애주었다.)
function solution(s1, s2) {
const overlap = s1.filter((x) => s2.includes(x));
return overlap.length;
}
includes를 이용해 같은 원소가 있는지 확인하고(같은 원소가 있을 경우 true, 없을 경우 false 반환),
같은 원소가 있을 경우 filter로 같은 원소의 값만 걸러낸 뒤, 그 배열의 길이를 구하는 식으로 코드를 작성한 사람들도 있었다.
set을 이용하기 전, filter를 사용할 생각은 했지만 includes를 사용할 생각까진 못했었는데!
오늘도 코딩 테스트를 하면서 많이 배웠다. 😊
출처: 프로그래머스 코딩 테스트 연습, https://school.programmers.co.kr/learn/challenges