코딩테스트/프로그래머스
[프로그래머스] 입문 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