인프런 커뮤니티 질문&답변
8주차 개념강의 - 3653번 질문입니다.
작성
·
407
0
http://boj.kr/4bf036e939474a3a89f75c5f0163382c
같은 로직의 코드여도 벡터를 넘겨서 트리를 만들면 시간 초과가 발생합니다.
벡터를 선언하고 초기화하는 게 시간복잡도에 영향을 많이 미치나요?
답변 1
1
큰돌
지식공유자
안녕하세요 yeon님 ㅎㅎ
일단 다음과 같은 차이점은 존재합니다.
전역변수보다는 지역변수로 하는게 더 좋습니다. 지역변수는 stack에 할당이 되고 쓰레기값이 할당이 됩니다. 전역변수는 bss segement 또는 data segment에 들어가면서 값을 초기화 하지 않은 경우 0으로 초기화가 됩니다.
지역변수로 선언하게 되면 stack에 쌓이는데 이 때 OS에서 성능상의 이유로 stack 영역에 메모리 제한을 걸어버립니다. 그렇기 때문에 많은 배열을 선언하지 못합니다. 다음과 같은 코드를 볼까요? 전역변수와 지역변수로 선언한 똑같은 tree인데 지역변수로 선언한 tree는 문제가 생겨서 아래의 로직이 실행되지 않습니다.
#include<bits/stdc++.h>
using namespace std;
int a, b;
int tree[10000000]; // 잘 됨.
int main(){
// 잘되지 않음 : int tree[10000000];
cin >> a >> b;
}vector를 TC마다 선언하거나 선언해놓고 초기화하는 차이는 미비하나 선언하고 초기화하는 것이 캐싱상 더 좋습니다.
그리고 제가 yeon님의 방식으로 코드를 구축해봤는데요. 시간초과는 뜨지 않습니다. 참고 부탁드려요.
http://boj.kr/c2c20f6173954265acbf204110667e75
또 질문 있으시면 언제든지 질문 부탁드립니다.
감사합니다.
강사 큰돌 올림.






답변 감사합니다! tree를 벡터에서 배열로 바꿨더니 해결이 되어서 이 문제 때문에 시간초과가 났었나 했는데 아니었군요.. 선생님 코드 보면서 원인이 무엇인지 다시 찾아보겠습니다. 감사합니다!