[공부] 261007 - 클래스
문제 템플릿
문제 번호
// 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. 두 강좌의 잔여 좌석
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;
}
}
}
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객체로 만들었다.각 객체에 정원과 현재 신청 인원을 넣었다.csharpCourse am = new Course(); Course pm = new Course();추가 신청 인원은 별도의 변수에 저장한 뒤 각각의csharpam.Capacity = int.Parse(Console.ReadLine()); am.Enrolled = int.Parse(Console.ReadLine()); pm.Capacity = int.Parse(Console.ReadLine()); pm.Enrolled = int.Parse(Console.ReadLine());TryEnroll()에 전달했다.csharpbool amResult = am.TryEnroll(amPlus); bool pmResult = pm.TryEnroll(pmPlus);TryEnroll()에서는- 신청 인원이 양수인지 확인
- 추가해도 정원을 넘지 않는지 확인
- 조건을 만족하면
Enrolled증가 후true - 조건을 만족하지 않으면 기존 인원을 유지하고
false를 반환했다.
잔여 좌석은csharpif(count > 0 && Enrolled + count <= Capacity) { Enrolled += count; return true; } return false;로 계산했다.csharpreturn Capacity - Enrolled;남은 것
남은 것
Name필드는 문제에서 요구했지만 실제 풀이에서는 사용하지 않았다.- 객체의 필드와 메서드를 사용할 때 현재 필요한 값이 무엇인지 더 빠르게 구분할 필요가 있다.
- 출력할 때
Enrolled와GetRemaining()을 헷갈리지 않도록 해야 한다.
알게된것
Course am = new Course();→ 오전 강좌 객체 생성Course pm = new Course();→ 오후 강좌 객체 생성am.Capacity→ 오전 객체의 정원am.Enrolled→ 오전 객체의 현재 신청 인원am.TryEnroll(amPlus)→ 오전 객체의 신청 처리am.GetRemaining()→ 오전 객체의 잔여 좌석
객체마다 자기 자신의 필드 값을 가지고 있으며, 메서드도 그 객체의 데이터를 기준으로 동작한다.
이번 문제에서 중요한 흐름:
객체 생성 → 필드에 입력 → 메서드 호출 → 반환값 저장 → 메서드로 결과 출력
문제 템플릿
문제 번호
- 소요시간 - 20분
- AI 질문? - 함
어려웠던 이유?
어떻게 풀었나?
남은 것
알게된것



