visual studio에서는 컴파일러로서 msvc를 사용하는데, 동적 배열 할당을 지원하지 않아서
배열의 크기를 변수에 받아서 선언하고자 할 때에는 포인터를 사용해야 합니다.
10026번 - 적록색약
일단 로직에 문제가 있는것은 맞습니다.
올려주신 코드 그대로 복붙해서 디버깅 해보니 예제 입력에서 N이 5인데 20번째줄에 x가 4인 경우가 있었습니다.
그러면 arr[x + 1]은 입력을 받지 않는 string이죠.
string은 vector를 기반으로 하고 있는데 생성자에서 사이즈를 명시해주지 않으면 사이즈가 0입니다.
다만 capacity를 어떻게 늘릴 것인지 capacity의 초기 값은 몇으로 할건지는 c++ 명세에서 명시하지 않고 있어서 컴파일러마다 구현이 다를 수 있는데 일단 경험상 vs의 경우는 capacity도 0이었습니다.
size 범위를 벗어나지만 capacity 안에 들어오는 위치에 대한 액세스는 명백한 버그 상황이 맞긴하나 []연산자에 대해서는 bufferoverflow가 발생했을때 어떻게 처리해야하는지도 표준에서는 자율에 맞기고 있습니다. 위 코드로 정답처리 받으셨다면 BOJ 채점에서 쓰는 gcc의 빌드옵션에서는 이러한 버그 상황에 좀 관대한 것 같습니다.
C++ 표준 명세에서는 operator[]가 아닌 at메서드인 경우 익셉션을 throw하도록 명시하고 있고 gcc 등에서도 위 코드의 [] 대신 at을 쓰면 런타임 에러가 발생할 것입니다.
좀 보충하자면
size에서는 벗어나고 capacity에는 들어오는 []액세스의 경우 구현상 허용해도 문제가 되지 않는 이유는 그 공간은 어차피 그 벡터가 예약해둔 메모리기 때문에 메모리 자체에 대한 오너십은 그 벡터에게 있기 때문입니다.
댓글을 작성하려면 로그인해야 합니다.
otter66 3년 전
문제의 정답 딱지는 받았지만..
아래의 코드가 백준, repl에서는 실행이 되지만
visual에서는 오류가 발생합니다
20번째 줄에서 예외 발생으로 종료되는 이유가 궁금합니다.