PS를 하다가 로직이 아무리 생각해도 완벽한데 계속 틀릴 때가 가장 답답하다.
대부분의 경우 오타가 났거나, 오버플로우/언더플로우를 고려하지 못했거나, 문제를 잘못 읽었거나 중 하나인데 드문 경우 프로그래밍 언어의 기능을 잘 숙지하지 못한 경우가 있다.
C++로 PS를 하다 보면 auto라는 키워드를 자주 쓰게 된다. range-based loop보다 훨씬 짧게 쓸 수 있고 간편하기 때문이다. 근데 오늘 다음과 같은 상황이 있었다.
struct x { int e; long long t; };
vector<x> g[501];
int main(void) {
...
while (TC--) {
for (auto x: g) x.clear();
...
}
...
}
정의된 array of vector를 매 tc마다 초기화해 주어야 했기에 위와 같이 코드를 작성했다. 로직이 분명 맞는데, 계속 WA를 받아서 다른 사람의 코드랑 어떤 부분이 다른지를 하나 하나 보면서 차이는 저 초기화 부분 이외에는 없다는 결론에 도달했다.
auto 키워드에 대해 찾아봤고, 결론적으로 auto 키워드는 값을 value 형태로 가져오기 때문에 그렇다는 것을 알게 되었다. 즉, 값을 복사한다는 것이다. 위의 코드에서는 g에 들어 있는 특정 vector를 통째로 복사해서 x라는 이름으로 가져오고, 그 x를 clear한 것이다. 해결 방법은 여러 가지가 있었는데 첫 번째는 for (auto& x: g)와 같이 참조자를 사용하는 것이고 두 번째는 그냥 index-based loop로 clear하는 것이었다.
댓글