부족한 금액 계산하기
새로 생긴 놀이기구는 인기가 매우 많아 줄이 끊이질 않습니다. 이 놀이기구의 원래 이용료는 price원 인데, 놀이기구를 N 번 째 이용한다면 원래 이용료의 N배를 받기로 하였습니다. 즉, 처음 이용료가 100이었다면 2번째에는 200, 3번째에는 300으로 요금이 인상됩니다.
놀이기구를 count번 타게 되면 현재 자신이 가지고 있는 금액에서 얼마가 모자라는지를 return 하도록 solution 함수를 완성하세요.
단, 금액이 부족하지 않으면 0을 return 하세요.
제한사항
- 놀이기구의 이용료 price : 1 ≤ price ≤ 2,500, price는 자연수
- 처음 가지고 있던 금액 money : 1 ≤ money ≤ 1,000,000,000, money는 자연수
- 놀이기구의 이용 횟수 count : 1 ≤ count ≤ 2,500, count는 자연수
입출력 예
price | money | count | result |
3 | 20 | 4 | 10 |
입출력 예 설명
입출력 예 #1
이용금액이 3인 놀이기구를 4번 타고 싶은 고객이 현재 가진 금액이 20이라면, 총 필요한 놀이기구의 이용 금액은 30 (= 3+6+9+12) 이 되어 10만큼 부족하므로 10을 return 합니다.
- 내가 푼 풀이
function solution(price, money, count) {
var answer = 0;
let sum = 0;
for(let i=1; i<=count; i++){
sum += price*i
}
if(money-sum < 0){
answer = Math.abs(money-sum)
}else{
answer = 0
}
for 문을 통해 이용할 때 마다 n배 되는 이용 요금을 더해주어 가진 전체금액에서 빼주는 직관적인 풀이.
주의해야할 것은 내가 가진 돈보다 많이 나올 경우 'money-sum'이 음수의 결과가 나오기 때문에 Math.abs()를 통해서 절댓값을 만들어줘야 한다.
- Math.abs() : 주어진 숫자의 절댓값을 반환
- 다른 풀이
function solution(price, money, count) {
let answer = 0;
for (let i = 1; i <= count; i++) {
answer += price * i;
}
return answer > money ? answer - money : 0;
}
내가 푼 풀이와 큰 틀은 비슷하지만, return에서 if 조건문이 아니라 3항연산자를 사용해 코드를 조금 더 간결하게 표현했다.
그리고 필요한 총비용에서 money를 빼줌으로써 절댓값을 만들어줘야하는 부분도 생략했다.
문자열 다루기 기본
문자열 s의 길이가 4 혹은 6이고, 숫자로만 구성돼있는지 확인해주는 함수, solution을 완성하세요. 예를 들어 s가 "a234"이면 False를 리턴하고 "1234"라면 True를 리턴하면 됩니다.
제한 사항
- s는 길이 1 이상, 길이 8 이하인 문자열입니다.
- s는 영문 알파벳 대소문자 또는 0부터 9까지 숫자로 이루어져 있습니다.
입출력 예
s | return |
"a234" | false |
"1234" | true |
- 내가 푼 풀이
function solution(s) {
var answer = true;
if((s.length === 4) || (s.length === 6)){
answer = s.split("").every(c => !isNaN(c))
} else {
answer = false
}
return answer;
}
조건문을 통해 1차로 글자수를 검증한 후, 조건에 맞을 경우 문자열을 배열로 만들어 모든 글자가 숫자인지 확인하였다.
- every() : 배열의 모든 요소가 주어진 조건을 만족하는지 검사하는 배열 메서드.
이 함수는 배열의 각 요소에 대해 주어진 콜백 함수를 실행하고,
모든 요소에 대해 true를 반환하면 true를 반환. 하나라도 false를 반환하면 즉시 false를 반환하고 더 이상 검사하지 않음.
- 다른 풀이
function solution(s) {
if(s.length != 4 && s.length != 6) return false;
for(var i = 0; i < s.length; i++) {
if(isNaN(Number(s[i]))) return false;
}
return true;
}
내가 푼 풀이와 큰 틀에서는 비슷하나, false 값을 걸러내는 방식을 택하였다.
나는 풀이를 진행하며 's' 문자열을 배열로 만들어 every() 배열 함수를 사용했는데, 이 풀이 속에서는 굳이 배열로 변환하지 않고 for문을 통해 문자열의 각 인덱스에 접근해 false 값을 걸러내는 방식을 택하였다.
문제를 풀 때마다 문자열에도 인덱스가 있고 배열에도 인덱스가 있어 두개가 헷갈리는 점이 조금 있었는데, 이렇게 비슷하지만 다르게 배열과 문자열을 다루는 풀이를 통해 이 부분에 대해 잘 이해할 수 있었던 것 같다.
잘 모르는 내 입장으론 for문을 돌리면 문자열이 배열화가 돼서 풀이가 되는건가? 라고 생각했는데, 그냥 간단하게 배열과 상관 없이 문자열도 인덱스가 있어서 각 인덱스에 접근할 수 있었던 것이다.
행렬의 덧셈
행렬의 덧셈은 행과 열의 크기가 같은 두 행렬의 같은 행, 같은 열의 값을 서로 더한 결과가 됩니다. 2개의 행렬 arr1과 arr2를 입력받아, 행렬 덧셈의 결과를 반환하는 함수, solution을 완성해주세요.
제한 조건
- 행렬 arr1, arr2의 행과 열의 길이는 500을 넘지 않습니다.
입출력 예
arr1 | arr2 | return |
[[1,2],[2,3]] | [[3,4],[5,6]] | [[4,6],[7,9]] |
[[1],[2]] | [[3],[4]] | [[4],[6]] |
- 내가 만든 풀이
function solution(arr1, arr2) {
var answer = [[]];
for(let i=0; i<arr1.length; i++){
answer[i] = [];
for(let j=0; j<arr1[i].length; j++){
answer[i].push(arr1[i][j] + arr2[i][j]);
}
}
return answer;
}
각 배열의 속에 있는 배열에 접근하여 더해주는 풀이이다.
첫번째 for문에서 이중 배열 중 바깥 배열에 접근 할 수 있도록 했으며, 빈 answer 배열을 만들어서 더해준 값을 넣을 준비를 해주었다.
중첩 for문을 통해서는 내부 배열에 접근할 수 있도록 만들어준 후, 같은 인덱스의 내부 값을 돌며 더해준 후, answer 배열에 추가해주도록 만들어냈다.
중첩 배열을 처음 접하게 되어 당황했지만, 각각의 배열로 생각하고 연결만 지어주면 어렵지 않다는 것을 알게되었다.
- 다른 풀이
matrix1.map((row, y) =>
row.map((v, x) => v + matrix2[y][x]));
function solution(arr1, arr2) {
return matrixAddition(arr1, arr2);
}
map함수도 중첩으로 사용한 배열.
map 함수에 대한 개념은 알지만 이런식으로 변형이 들어가면 이해가 어려워서 다시 기초로 돌아가서 생각해보기로했다.
//배열에 *2를 한 값을 출력하는 map 함수
const numbers = [1, 2, 3, 4, 5];
const doubledNumbers = numbers.map(num => num * 2);
console.log(doubledNumbers); // 출력: [2, 4, 6, 8, 10]
numbers의 각 배열 값들이 'num이라는 변수'로 들어가고 출력값은 '변수 * 2'를 한 값
우선 내가 이해하기 편하기 matrix - arr 로 바꿔서 써주겠다.
이것을 위 풀이에 적용시키면 arr1의 각 배열들이 'row, y(인덱스)'라는 변수로 들어가고 출력 값은 또 다른 map 함수. -> 중첩 for문의 바깥쪽
다음 map 함수는 row의 각 배열들이 'v, x(인덱스)'라는 변수로 들어가고 출력 값은 'v + arr2[y][x]'
결론 적으로 해석해보면, v= arr1[y][x]이다.
map 함수 출력값 = arr1[y][x] + arr2[y][x]
사실상 내가 for문을 이용해서 푼 풀이와 동일한 것인데, map함수가 이중으로 들어가고 인덱스까지 들어가 변수가 2개가 되면서 이해하는데 조금 애먹게 만든 것 같다. 각 함수들을 다양한게 이용하는걸 보고 직접 구현해보면서 각 함수에 대한 이해도를 높여야겠다는 생각이 들었다.
'개발 기초 다지기' 카테고리의 다른 글
RESTful API에 대하여 (0) | 2024.06.07 |
---|---|
Prisma로 데이터베이스 스키마 변경하기 (0) | 2024.06.06 |
효율적인 응답 메세지 관리 (message.constant.js 파일 이용하기) (1) | 2024.06.03 |
EC2 인스턴스 재시작시 오류 해결 (0) | 2024.05.31 |
알고리즘 문제 (약수의 개수와 덧셈, 문자열 내림차순으로 배치하기) (0) | 2024.05.30 |
댓글