코딩테스트 연습

TIL - 프로그래머스 체육복 문제 풀이 중 배운 점
1. erase 사용 시 인덱스 주의
erase()를 사용하면 뒤의 원소들이 앞으로 당겨진다.
예를 들어:
vector<int> v = {1, 2, 3};
v.erase(v.begin());
결과:
{2, 3}
이때 반복문이 그대로 진행되면 다음 원소를 건너뛸 수 있다.
i--;
등으로 인덱스를 조정해줘야 한다.
2. 체육복 문제에서 가장 중요한 예외
여벌 체육복이 있는 학생이 동시에 체육복을 도난당한 경우가 있다.
예시:
lost = {2}
reserve = {2}
2번 학생은 체육복이 2벌 있었지만 1벌을 도난당한 상태이다.
따라서:
- 본인은 수업 참여 가능
- 다른 학생에게 빌려줄 수 없음
3. lost와 reserve의 중복 제거를 먼저 해야 함
잘못 생각한 방법:
if (lost[j] == reserve[k] - 1 ||
lost[j] == reserve[k] + 1)
를 먼저 검사하는 것.
반례:
lost = {1, 2}
reserve = {2, 3}
2번 학생은 자기 체육복도 도난당했으므로 1번 학생에게 빌려줄 수 없다.
하지만 중복 제거를 먼저 하지 않으면 2번 학생이 1번 학생에게 체육복을 빌려준 것으로 처리될 수 있다.
4. 문제 해결 순서
1단계
lost와 reserve에 동시에 존재하는 학생 제거
lost = {1, 2}
reserve = {2, 3}
↓
lost = {1}
reserve = {3}
2단계
남은 reserve 학생들이 앞번호 또는 뒷번호 학생에게 체육복을 빌려준다.
lost[j] == reserve[i] - 1
||
lost[j] == reserve[i] + 1
5. 이번 문제에서 얻은 교훈
알고리즘 문제는 구현보다 예외 상황을 먼저 찾는 것이 중요하다.
특히 이번 문제에서는
lost ∩ reserve
인 학생들을 먼저 처리하지 않으면 아무리 로직을 수정해도 계속 반례가 발생한다.
따라서 문제 조건을 꼼꼼히 읽고 예외 케이스를 먼저 정리한 뒤 구현하는 습관이 필요하다.
'C++' 카테고리의 다른 글
| 2026-6-1 코드카타 (0) | 2026.06.01 |
|---|---|
| STL (0) | 2026.03.24 |
| 기본 생성자와 오버로딩 (0) | 2026.03.12 |
| 생성자와 소멸자 (0) | 2026.03.12 |
| C++로 전직 시스템과 전투 시스템 구현해보기 (0) | 2026.03.10 |