조건문 복습 및 생각

공재원
∙∙조회 4

Q10. 주문 상태 변경

문제

현재 주문 상태, 현재 잔액, 처리할 명령을 한 줄씩 입력받아 주문 하나를 처리함. 주문 금액은 3000원이며 현재 상태는 접수·결제·발송·취소 중 하나, 잔액은 0~100000의 정수임. 결제·발송 상태의 잔액은 이미 주문 금액을 지불한 뒤의 값임. 명령은 대소문자를 구분함.

  • pay: 접수 상태에서만 결제할 수 있음. 잔액이 충분하면 3000원을 차감하고 결제로 바꾸며 결제 완료를 출력함. 부족하면 잔액 부족, 다른 상태라면 결제할 수 없는 상태를 출력함.
  • ship: 결제 상태만 발송으로 바꾸고 발송 완료를 출력함. 다른 상태이면 발송할 수 없는 상태를 출력함.
  • cancel: 접수 상태이면 취소로 바꾸고 접수 취소를 출력함. 결제 상태이면 3000원을 환불하고 취소로 바꾸며 결제 취소 및 환불을 출력함. 발송이면 발송 후 취소 불가, 취소이면 이미 취소됨을 출력함.
  • 그 외 명령은 알 수 없는 명령을 출력함.

거절된 명령은 상태와 잔액을 바꾸지 않음. 처리 메시지 다음에 최종 상태와 잔액을 출력함.


plaintext
입력 예시

결제
2000
cancel

plaintext
예상 결과

결제 취소 및 환불
상태: 취소
잔액: 5000

내가 작성한 코드

csharp
using System;

string order = Console.ReadLine();
int balance = int.Parse(Console.ReadLine());
string command = Console.ReadLine();

const int Price = 3000;

if (command == "pay")
{
    if (order == "접수")
    {
        if (balance >= Price)
        {
            balance -= Price;
            order = "결제";
            Console.WriteLine("결제 완료");
        }
        else
        {
            Console.WriteLine("잔액 부족");
        }
    }
else
    {
        Console.WriteLine("결제할 수 없는 상태");
    }
}
else if (command == "ship")
{
    if (order == "결제")
    {
        order = "발송";
        Console.WriteLine("발송 완료");
    }
else
    {
        Console.WriteLine("발송할 수 없는 상태");
    }
}
else if (command == "cancel")
{
    if (order == "접수")
    {
        order = "취소";
        Console.WriteLine("접수 취소");
    }
    else if (order == "결제")
    {
        balance += Price;
        order = "취소";
        Console.WriteLine("결제 취소 및 환불");
    }
    else if (order == "발송")
    {
        Console.WriteLine("발송 후 취소 불가");
    }
    else if (order == "취소")
    {
        Console.WriteLine("이미 취소됨");
    }
}
else
{
    Console.WriteLine("알 수 없는 명령");
}

Console.WriteLine($"상태: {order}");
Console.WriteLine($"잔액: {balance}");

선생님과 작성한 코드

csharp
using System;

const int Price = 3000;
string status = Console.ReadLine();
int balance = int.Parse(Console.ReadLine());
string command = Console.ReadLine();
string result = string.Empty;

switch (command)
{
    case "pay":
        if (status != "접수")
        {
            result = "결제할 수 없는 상태";
        }
        else if (balance < Price)
        {
            result = "잔액 부족";
        }
        else
        {
            balance -= Price;
            status = "결제";
            result = "결제 완료";
        }
        break;
    case "ship":
        if (status == "결제")
        {
            status = "발송";
            result = "발송 완료";
        }
        else
        {
            result = "발송할 수 없는 상태";
        }
        break;
    case "cancel":
        switch (status)
        {
            case "접수":
                status = "취소";
                result = "접수 취소";
                break;
            case "결제":
                balance += Price;
                status = "취소";
                result = "결제 취소 및 환불";
                break;
            case "발송":
                result = "발송 후 취소 불가";
                break;
            case "취소":
                result = "이미 취소됨";
                break;
            default:
                result = "알 수 없는 상태";
                break;
        }
        break;
    default:
        result = "알 수 없는 명령";
        break;
}    

Console.WriteLine(result);
Console.WriteLine($"상태: {status}");
Console.WriteLine($"잔액: {balance}");

내가 코드를 작성할 땐 if문을 최대한 사용하여 복잡한 코드가 작성 되었다.
선생님과 작성한 코드는 switch를 사용하여 간결한 코드가 작성 되었다.
두 코드 모두 결과는 같이 나오지만 문제를 어떻게 해석하느냐에 따라 코드가 완전히 다르게 나온다는 사실을 깨달았다.
추후에 취업을 하게 되어 다른 사람의 기획안을 보고 기획자의 의도에 맞춰 정확한 코드를 작성하기 위해서는 기획안을 짠 기획자와의 커뮤니케이션이 반드시 필요할 것으로 보인다. 또한 내가 이해하는 부분이 맞는지, 작성하는 코드가 불피요하진 않을지에 대해 많은 생각을 할 수 있을 것으로 예상된다.