코딩테스트/프로그래머스

[프로그래머스] 입문 Day 5 수학, 배열 (Javascript)

꼽파 2023. 12. 15. 14:02


옷가게 할인 받기

문제 설명

  • 머쓱이네 옷가게는 10만 원 이상 사면 5%, 30만 원 이상 사면 10%, 50만 원 이상 사면 20%를 할인해줍니다.
    구매한 옷의 가격 price가 주어질 때, 지불해야 할 금액을 return 하도록 solution 함수를 완성해보세요.

제한사항

  • 10 ≤ price ≤ 1,000,000
  • price는 10원 단위로(1의 자리가 0) 주어집니다.
  • 소수점 이하를 버린 정수를 return합니다.

입출력 예

price result
150,000 142,500
580,000 464,000

 

풀이 1

if-else 조건문으로 할인율 제시한 후 계산

function solution(price) {

    // 할인율
    const discount_rate = 0;

    if (price >= 500000) {
        discount_rate = 0.2
    } else if (price >= 300000) {
        discount_rate = 0.1
    } else if (price >= 100000) {
        discount_rate = 0.05
    } else {
        discount_rate = 0
    }

    // 총 비용
    const total_price = (1 - discount_rate) * price

    return Math.trunc(total_price);
}

 

풀이2

할인율을 2차원 배열로 입력한 후 계산함.

const discounts = [
    [500000, 20],
    [300000, 10],
    [100000,  5],
]

// price = 구매한 가격 (입력값)

const solution = (price) => {
    for (const discount of discounts) {
        // 할인 적용 시
        if (price >= discount[0]) {
            // 할인된 가격을 정수로 만들기 위해 
            return Math.floor(price - price * discount[1] / 100);
        }
    }
    // 할인 미 적용 시
    return price;
}

 

주의할 점

  • 두 번째 풀이가 굉장히 깔끔하다. 2차원 배열을 이용하여 아주 깔끔하게 구할 수 있다는 걸 깨달음.

아이스 아메리카노

문제 설명

  • 머쓱이는 추운 날에도 아이스 아메리카노만 마십니다. 아이스 아메리카노는 한잔에 5,500원입니다. 머쓱이가 가지고 있는 돈 money가 매개변수로 주어질 때, 머쓱이가 최대로 마실 수 있는 아메리카노의 잔 수와 남는 돈을 순서대로 담은 배열을 return 하도록 solution 함수를 완성해보세요.

제한사항

  • 0 < money ≤ 1,000,000

입출력 예

money result
5,500 [1, 0]
15,000 [2, 4000]

 

풀이 1

문제를 그대로 옮겨주고, 개수는 Math.floor을 활용

function solution(money) {

    const price = 5500;  // 아메리카노 가격
    count = Math.floor(money / price)  // 개수
    const change = money - count * price  // 남은 돈
    var answer = [count, change];
    
    return answer;
}

 

풀이 2

리턴값에 바로 넣어줌.

function solution(money) {
    return [Math.floor(money / 5500), money % 5500];
}

 

풀이 3

풀이 2와 유사한데 비트연산자 활용

function solution(money) {
    return [~~(money / 5500), money % 5500];
}

~~(money / 5500) : 비트 연산자를 사용하여 계산된 나눈 몫을 소수점 이하를 제거한 정수로 변환


나이 출력

문제 설명

  • 머쓱이는 40살인 선생님이 몇 년도에 태어났는지 궁금해졌습니다. 나이 age가 주어질 때, 2022년을 기준 출생 연도를 return 하는 solution 함수를 완성해주세요.

제한사항

  • 0 < age ≤ 120
  • 나이는 태어난 연도에 1살이며 1년마다 1씩 증가합니다.

입출력 예

age result
40 1983
23 2000

 

방법 1

문제 그대로 사칙연산을 활용하여 리턴값 반환

function solution(age) {
    var birth_year = 2022 - age + 1;
    return birth_year;
}

 

방법 2

Date().getFullYear() 활용

function solution(age) {
    // 현재 날짜 연도를 반환하는 Date 객체 생성
    // getFullYear() 매서드 호출해서 현재 연도 가져오기
    return new Date().getFullYear() - age + 1;
}

 

주의할 점

  • 문제의 주어진 연도는 2022년이었으므로 방법 2는 현재 사용 불가능하다.

배열 뒤집기

문제 설명

  • 정수가 들어 있는 배열 num_list가 매개변수로 주어집니다. num_list의 원소의 순서를 거꾸로 뒤집은 배열을 return하도록 solution 함수를 완성해주세요.

제한사항

  • 1 ≤ num_list의 길이 ≤ 1,000
  • 0 ≤ num_list의 원소 ≤ 1,000

입출력 예

num_list  result
[1, 2, 3, 4, 5]  [5, 4, 3, 2, 1]
[1, 1, 1, 1, 1, 2] [2, 1, 1, 1, 1, 1]
[1, 0, 1, 1, 1, 3, 5] [5, 3, 1, 1, 1, 0, 1]

 

풀이 1

반복문을 사용하여 역순 배열 생성

function solution(num_list) {
    let answer = [];
    for (i = num_list.length -1; i >= 0; i--){
        answer.push(num_list[i])   
    }
    return answer;
}
function solution(num_list) {
    var answer = [];
    var j = num_list.length;
    for(var i = 1; i <= j; i++){
        answer.push(num_list[j-i]);
    }
    return answer;
}

아래 풀이는 위와 비슷한데 answer.push()에서 인덱스값을 (배열길이 - 해당 인덱스)으로 한 것이 인상적임.  

 

풀이 2

reverse() 매서드 사용함.

function solution(num_list) {
    return num_list.reverse()
}

 

풀이 3

sort() 매서드를 사용하여 역순 정렬

function solution(num_list) {
	// 비교함수의 리턴값이 -1이면 항상 a를 b보다 작은 값으로 간주하게 됨
    return num_list.sort((a, b) => -1);
}

 

풀이 4

forEach와 unshift 매서드 사용

function solution(num_list) {
    var answer = [];
    num_list.forEach(i => answer.unshift(i))
    return answer
}
728x90