[공부] 261007 - 클래스

강현구
∙∙조회 7

 


문제 템플릿

 

문제 번호

csharp
// Counter.cs
internal class Counter
{
    public string Name;
    public int Capacity;
    public int Waiting;

    public bool CanAccept(int amount)
    {
        return amount > 0 && Waiting + amount <= Capacity;
    }

    public void Accept(int amount)
    {
        if (CanAccept(amount))
        {
            Waiting += amount;
        }
    }
}

// Program.cs 핵심 부분
Counter selected = null;
foreach (Counter counter in counters)
{
    if (counter.CanAccept(amount) &&
        (selected == null || counter.Waiting < selected.Waiting))
    {
        selected = counter;
    }
}

if (selected == null)
{
    Console.WriteLine("배정 불가");
}
else
{
    selected.Accept(amount);
    Console.WriteLine($"{selected.Name}: {selected.Waiting}");
}

 

  • 소요시간 - 20분
  • AI 질문? - 함 (결과가 다르게 나오는 원인 확인. 선생님과 같이 풀었던 코드)

 

어려웠던 이유?

  •  로직(가능한 창구 중 대기가 가장 적은 곳 고르기)은 맞는데 출력이 예상과 다르게 나와서, 어디가 문제인지 찾기 어려웠음
  • 메인 코드는 정상이고, 보이지 않던 Counter 클래스의 Accept 메서드에 문제가 있었음
  • 메인 코드와 클래스 코드가 파일이 나뉘어 있어서 한쪽만 보면 원인이 안 보임

 

어떻게 풀었나?

  •  첫 요청부터 손으로 따라감: A(1)에 2명 배정이면 A는 3이어야 하는데 5로 나옴 → 대기 인원이 2씩 더해졌음을 확인
  • Accept 안에 Waiting += amount가 두 번 있었음. 하나는 if (CanAccept) 안에, 하나는 if 밖에 (조건 상관없이 무조건 실행)
  • if 밖의 Waiting += amount를 삭제해서 해결
  • 이상한 결과(A: 5, 배정 불가, B: 7)가 전부 이 한 줄로 설명됨

 

남은 것

  •  입력 안내 줄이 창구 1이름:처럼 붙어서 나옴 (Console.Write($"창구 {i + 1}") 뒤에 줄바꿈 없음). 채점에서 입력 안내까지 보면 수정 필요
  • {i + 1}번 요청 인원에도 : 빠짐

 

알게된것

  • 결과가 이상할 때는 예시 첫 입력만 손으로 따라가 보면 어디서 어긋나는지 바로 보임
  • 메인 코드가 맞아 보이는데 결과가 틀리면, 호출하는 클래스 메서드 안쪽을 의심할 것
  • 수정할 때 "옮긴 것"인지 "추가한 것"인지 확인하고, 원래 있던 줄을 지웠는지 점검할 것 (조건 안에 넣어놓고 밖의 원본을 안 지우면 두 번 실행됨)
  • 호출하는 쪽에서 CanAccept로 이미 거르더라도, 메서드 안에서 한 번 더 확인하는 건 안전장치로 괜찮음
  • 객체의 필드를 바꾸는 코드는 한 곳(Accept)에만 두면 버그 위치를 찾기 쉬움

 


문제 번호: CH16 Q1. 두 강좌의 잔여 좌석

 

csharp
using System;
using System.Collections.Generic;
using System.Text;

namespace CH16_Q01
{
    internal class Course
    {
        //공개 필드
        public int Name;
        public int Capacity; // 정원
        public int Enrolled; //등록

        //메서드
        //오전 강좌 정원: 10
        //오전 현재 신청 인원: 7
        //오후 강좌 정원: 8
        //오후 현재 신청 인원: 2
        public bool TryEnroll(int count)
        {
            // 정원을 넘지 않을 때에만 인원을 늘리고
            //오전 추가 신청 인원: 3
            //오후 추가 신청 인원: 7
            if(count > 0 && Enrolled + count <= Capacity)
            {
                Enrolled += count;
                return true;
            }

            return false;
        }

        public int GetRemaining()
        {
            return Capacity - Enrolled;
        }


    }
}

 

csharp
using System;
using CH16_Q01;

//Capacity
Course am = new Course();
Course pm = new Course();


Console.Write("오전 강좌 정원: ");
am.Capacity = int.Parse(Console.ReadLine());//정원 넣기
Console.Write("오전 현재 신청 인원: ");
am.Enrolled = int.Parse(Console.ReadLine());//인원 넣기

Console.Write("오후 강좌 정원: ");
pm.Capacity = int.Parse(Console.ReadLine());//정원 넣기
Console.Write("오후 현재 신청 인원: ");
pm.Enrolled = int.Parse(Console.ReadLine());//인원 넣기


Console.Write("오전 추가 신청 인원: ");
int amPlus = int.Parse(Console.ReadLine());
Console.Write("오후 추가 신청 인원: ");
int pmPlus = int.Parse(Console.ReadLine());

bool amResult = am.TryEnroll(amPlus);
bool pmResult = pm.TryEnroll(pmPlus);


Console.WriteLine($"오전: {amResult}, {am.GetRemaining()} ");
Console.WriteLine($"오후: {pmResult}, {pm.GetRemaining()} ");
Console.WriteLine($"잔여 합계: {am.GetRemaining() + pm.GetRemaining()} ");


 

  • 소요시간 - 20분
  • AI 질문? - 함

 

어려웠던 이유?

  • Course 객체를 만들고 각각의 데이터를 넣는 것과 TryEnroll() 호출까지는 이해했다. 처음에는 TryEnroll()의 결과를 출력할 때 현재 신청 인원(Enrolled)을 출력해서, 문제에서 요구한 잔여 좌석(GetRemaining())과 헷갈렸다. 즉, Enrolled = 현재 신청 인원 GetRemaining() = 정원 - 현재 신청 인원 이라는 관계를 다시 확인할 필요가 있었다. 또한 메서드가 입력이나 출력을 하는 것이 아니라, 전달받은 값을 이용해서 처리한 뒤 결과를 반환한다는 점을 확인했다.

 

 

어떻게 풀었나?

  • 먼저 오전과 오후를 각각 별도의 Course 객체로 만들었다.
    csharp
    Course am = new Course();
    Course pm = new Course();
    
    각 객체에 정원과 현재 신청 인원을 넣었다.
    csharp
    am.Capacity = int.Parse(Console.ReadLine());
    am.Enrolled = int.Parse(Console.ReadLine());
    
    pm.Capacity = int.Parse(Console.ReadLine());
    pm.Enrolled = int.Parse(Console.ReadLine());
    
    추가 신청 인원은 별도의 변수에 저장한 뒤 각각의 TryEnroll()에 전달했다.
    csharp
    bool amResult = am.TryEnroll(amPlus);
    bool pmResult = pm.TryEnroll(pmPlus);
    
    TryEnroll()에서는
    1. 신청 인원이 양수인지 확인
    2. 추가해도 정원을 넘지 않는지 확인
    3. 조건을 만족하면 Enrolled 증가 후 true
    4. 조건을 만족하지 않으면 기존 인원을 유지하고 false 를 반환했다.
    csharp
    if(count > 0 && Enrolled + count <= Capacity)
    {
        Enrolled += count;
        return true;
    }
    
    return false;
    
    잔여 좌석은
    csharp
    return Capacity - Enrolled;
    
    로 계산했다.

    남은 것

 

 

남은 것

  • Name 필드는 문제에서 요구했지만 실제 풀이에서는 사용하지 않았다.
  • 객체의 필드와 메서드를 사용할 때 현재 필요한 값이 무엇인지 더 빠르게 구분할 필요가 있다.
  • 출력할 때 Enrolled와 GetRemaining()을 헷갈리지 않도록 해야 한다.

 

 

알게된것

  • Course am = new Course(); → 오전 강좌 객체 생성
  • Course pm = new Course(); → 오후 강좌 객체 생성
  • am.Capacity → 오전 객체의 정원
  • am.Enrolled → 오전 객체의 현재 신청 인원
  • am.TryEnroll(amPlus) → 오전 객체의 신청 처리
  • am.GetRemaining() → 오전 객체의 잔여 좌석

객체마다 자기 자신의 필드 값을 가지고 있으며, 메서드도 그 객체의 데이터를 기준으로 동작한다.

이번 문제에서 중요한 흐름:

객체 생성 → 필드에 입력 → 메서드 호출 → 반환값 저장 → 메서드로 결과 출력

 

 

 


문제 템플릿

 

문제 번호

 

csharp

 

  • 소요시간 - 20분
  • AI 질문? - 함

 

어려웠던 이유?

  •  

 

 

어떻게 풀었나?

  •  

 

 

남은 것

  •  

 

 

알게된것

  •