C++

2026-6-2 코드카타

왕건 2026. 6. 2. 11:28

코딩테스트 연습

 

 

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