[문제 설명]
[제한사항]
- reqs의 길이는 1 이상 100,000 이하입니다.
- reqs의 원소는 명령어 계좌아이디 숫자 형식입니다.
- 명령어는 CREATE, DEPOSIT, WITHDRAW 중 하나입니다.
- 계좌아이디 는 영문 소문자와 숫자로 구성된, 길이 1 이상 30 이하인 문자열입니다.
- 숫자는 1 이상 1,000,000 이하인 자연수입니다.
[입출력 예]
reqs | result |
["DEPOSIT 3a 10000", "CREATE 3a 300000", "WITHDRAW 3a 150000", "WITHDRAW 3a 150001"] | [404,200,200,403] |
["CREATE 3a 10000", "CREATE 3a 20000", "CREATE 2bw 30000"] | [200,403,200] |
[입출력 예 설명]
입출력 예 #1
- 앞서 설명한 예와 같습니다.
입출력 예 #2
들어온 요청 | 처리 결과 |
CREATE 3a 10000 | -10,000 만큼 출금할 수 있는 계좌를 개설합니다. 200 코드를 보냅니다. |
CREATE 3a 20000 | 이미 3a번 계좌가 있으므로 403 코드를 보냅니다. |
CREATE 2bw 30000 | -30,000 만큼 출금할 수 있는 계좌를 개설합니다. 200 코드를 보냅니다. |
- 따라서 [200,403,200]을 리턴해야 합니다.
[제출답안]
export default function solution(arr) {
let answer = [];
let accountList = [];
const checkIfAccountExist = (checkAccountNumber, requestAmount, type) => {
let isExist = false;
if (accountList.length > 0) {
accountList.forEach((account) => {
if (account.accountNumber === checkAccountNumber) {
isExist = true;
}
});
}
if (type === "CREATE") {
accountList.push({
accountNumber: checkAccountNumber,
amount: requestAmount,
});
}
return isExist;
};
const makeDeposit = (depositAccountNumber, requestAmount) => {
accountList.forEach((account) => {
if (account.accountNumber === depositAccountNumber) {
account.amount += requestAmount;
}
});
};
const checkIfWithDrawable = (withdrawableAccountNumber, requestAmount) => {
let isWithdrawable = false;
accountList.forEach((account) => {
if (account.accountNumber === withdrawableAccountNumber) {
if (account.amount > requestAmount) {
account.amount -= requestAmount;
isWithdrawable = true;
}
}
});
return isWithdrawable;
};
arr.forEach((request) => {
const REQUEST_TYPE = request.split(" ")[0];
const ACCOUNT_NUMBER = request.split(" ")[1];
const REQUEST_AMOUNT = request.split(" ")[2];
const accountExistValidation = checkIfAccountExist(
ACCOUNT_NUMBER,
REQUEST_AMOUNT,
REQUEST_TYPE
);
switch (REQUEST_TYPE) {
case "CREATE":
if (accountExistValidation) {
answer.push(403);
} else {
answer.push(200);
}
break;
case "DEPOSIT":
if (accountExistValidation) {
makeDeposit(ACCOUNT_NUMBER, REQUEST_AMOUNT);
answer.push(200);
} else {
answer.push(404);
}
break;
case "WITHDRAW":
if (accountExistValidation) {
if (checkIfWithDrawable(ACCOUNT_NUMBER, REQUEST_AMOUNT)) {
answer.push(200);
} else {
answer.push(403);
}
} else {
answer.push(404);
}
break;
default:
break;
}
});
return answer;
}
'Algorithm Test' 카테고리의 다른 글
리눅스 쉘 명령어 (0) | 2022.08.16 |
---|---|
재정렬 배열 반환 (0) | 2022.08.16 |
신규 아이디 추천 (0) | 2022.07.18 |
숫자 문자열과 영단어 (0) | 2022.07.14 |
생년월일 Validation (0) | 2022.05.04 |