• 카테고리

    질문 & 답변
  • 세부 분야

    알고리즘 · 자료구조

  • 해결 여부

    미해결

안녕하세요 89: 토마토 문제 관련 질문있습니다!

24.01.19 16:08 작성 24.01.19 16:11 수정 조회수 123

0

강의 항상 잘듣고있습니다!

89 토마토 문제 관련 제가 짠 코드에서 결과값은 문제 없이 나오지만 컴파일러가 아래와 같은 New_allocator 창을 띄우면서 pause 되는 문제가 있는데 코드를 아무리 봐도 에러가 왜 발생하는지 모르겠어서 질문 올립니다 . #include<iostream> #include<vector> #include<algorithm> #include<cmath> #include<queue> using namespace std; //넘겨야할 인자가 x,y,day 세개라서 class 필요 class Tmt{ public: int x; int y; int day; Tmt(int a, int b , int c){ x = a; y = b; day = c; } }; int main(){ freopen("input.txt","rt",stdin); int m,n; cin >> m >> n; // m = j = 가로 // n = i = 세로 vector<vector<int>>map(m+2,vector<int>(n+2,1)); //얘는 어차피 익으면 1로바뀌니까 ch가 따로 필요없을 것 같음. //vector<vector<int>>ch(n+2,vector<int>(m+2,0)); queue<Tmt>q; //상하좌우 탐색용 방향벡터 int dx[] = {1,0,-1,0}; int dy[] = {0,1,0,-1}; // input 읽어오는 동시에 초기 셋팅값 확인하기 int flag = 0; // flag 1 = 값이 1인 좌표 존재 for(int i = 1; i<=n ; i++){ for(int j = 1 ; j <=m;j++ ){ int temp; cin >> temp; map[i][j] = temp; if(map[i][j]==1){ flag = 1; // x,y 좌표 및 초기 0 day 삽입 및 ch 체크 q.push(Tmt(j,i,0)); } //cout << map[i][j]; } //cout << "\n"; } if(flag == 0){ //익은게 하나도없어서 결국 아무것도 안변함 -1반환 cout<<-1; return 0; } if(q.size() == n *m){ //시작때부터 다 익어있음 cout<<0; return 0; } int res = 0; //초기 setting된 q 활용해서 day 진행 while(!q.empty()){ Tmt temp = q.front(); int t_x = temp.x ; int t_y = temp.y; int t_day = temp.day; res = t_day; cout << " t_x: " << t_x << " t_y: "<<t_y<<" t_day: "<<t_day << "\n"; q.pop(); for(int i = 0; i<4;i++){ //cout <<" t_x+dx[i]: " <<t_x+dx[i] << " t_y+dy[i]: "<<t_y+dy[i] << " m: " << m << " n: "<<n << "map[t_x+dx[i]][t_y+dy[i]]: "<<map[t_x+dx[i]][t_y+dy[i]]<<"\n"; if((0<t_x+dx[i]<=m) && (0<t_y+dy[i]<=n) &&(map[t_y+dy[i]][t_x+dx[i]] == 0)){ //cout <<" t_x+dx[i]: " <<t_x+dx[i] << " t_y+dy[i]: "<<t_y+dy[i] << " m: " << m << " n: "<<n<<"\n"; map[t_y+dy[i]][t_x+dx[i]] = 1; q.push(Tmt(t_x+dx[i],t_y+dy[i],t_day+1)); } } } cout << res; return 0; }

답변 1

답변을 작성해보세요.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2024.01.21

안녕하세요, 인프런 AI 인턴입니다.

new_allocator.h 파일과 관련된 컴파일러 오류는 주로 메모리 할당이나 소멸자에서 문제가 발생했을 때 나타납니다.
IDE에서 발생한 이러한 오류 상황은 보통 다음과 같은 몇 가지 원인으로 인해 발생할 수 있습니다.

  1. 메모리 할당 또는 해제에서 문제가 발생했을 때
  2. 디버깅 중에 중지점(pause)이 걸렸을 때
  3. 예외 처리가 제대로 되지 않았을 때

제시해주신 코드를 살펴본 바로는 특정 조건에서 할당된 메모리가 제대로 해제되지 않거나 배열의 범위를 초과하여 접근하는 문제일 확률이 높아 보입니다. 벡터의 인덱스 확인(0<t_x+dx[i]<=m0<t_y+dy[i]<=n)은 올바르지만, C++에서 비교 연산자는 왼쪽부터 순차적으로 평가되기 때문에 0<t_x+dx[i] && t_x+dx[i]<=m과 같이 변경해야 합니다. 이러한 실수로 인해 배열의 범위를 벗어나 메모리 접근 오류가 발생할 수 있습니다.

또한, 사용하지 않는 ch 벡터 관련 코드가 주석 처리되어 있는데, 만약 이와 관련된 로직이 개입되었을 경우에도 메모리 접근 오류가 발생할 수 있습니다.

컴파일러 오류를 해결하기 위해서는 다음을 시도해볼 수 있습니다.
- 배열의 범위 초과 접근이 없는지 체크
- 예외 처리가 필요한 부분에 적절히 적용
- IDE의 디버깅 기능을 활용하여 정확한 오류 위치 파악

에러를 해결하기 위해서는 디버깅 과정에서 정확한 오류 위치와 원인을 파악해야 합니다. Visual Studio Code의 디버깅 기능을 사용하여 중단점을 설정하고, 변수 값의 변화를 추적해보세요.

도움이 필요하실 경우 제공된 이미지 URL과 관련 정보는 아래와 같습니다.
스크린샷 - Visual Studio Code에서의 C++ 디버깅 중단 상태
감사합니다!