본문 바로가기

Algorithm Test

입출금 response code 반환

[문제 설명]


[제한사항]

  • 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